数据转换成数组

  var  list = [
      {name: 'color', value: 'pink'},
      {name: 'color', value: 'black'},
      {name: 'color', value: 'green'},
      {name: 'size', value: 's'},
      {name: 'size', value: 'm'},
      {name: 'type', value: 'a'},
      {name: 'type', value: 'b'},
      {name: 'type', value: 'c'},
    ];
    将 list 转换成 list2的形式 :
    
    var list2 = [
      { name: 'color', value: ['pink','black', 'green' ]},
      { name: 'size', value: ['s','m' ]},
      { name: 'type', value: ['a','b', 'c' ]},
    ]
    
    下面是胡乱倒腾的做法:
    var  list2 = []
    var map = {}
    var dest = []
    for (var i = 0; i <list.length; i++) {
      var ai = list[i];
      if (!map[ai.name]) {
        dest.push({
          name: ai.name,
          value: ai.value + ","
        });
        map[ai.name] = ai;
      }  else {
        for (var j = 0; j < dest.length; j++) {
          var dj = dest[j];
          if (dj.name == ai.name) {
            dj.value += ai.value + ",";
            break;
          }
        }
      }
    }
    dest.forEach((item, index) => {
      var arr = {
        name: item.name,
        value: []
      };
      arr.value = item.value.split(",");
      this.list2.push(arr);
    });

得出的结果好像是有问题,没有达到效果, 请大伙帮忙看看囧[囧]

阅读 3.2k
3 个回答

你的for循环添加逗号分隔有问题,最后多添加了个逗号
改成如下:
for (var i = 0; i <list.length; i++) {

    var ai = list[i];
    if (!map[ai.name]) {
        dest.push({
            name: ai.name,
            value: ai.value 
        });
        map[ai.name] = ai;
    }  else {
        for (var j = 0; j < dest.length; j++) {
            var dj = dest[j];
            if (dj.name == ai.name) {
                dj.value +=  ","+ai.value;
                break;
            }
        }
    }
}

以下是我的一丝拙见,望能解决你的问题:

var list2 = Object.values(list.reduce((total, current) => {
    if(total[current.name]) {
        total[current.name]['value'].push(current.value);
    } else {
        total[current.name] = {
            name: current.name,
            value: [current.value]
        }
    }
    return total;
}, {}));

试试看这个。。

const list2 = list.reduce((a, b) => {
  const index = a.findIndex(e => e.name === b.name)
  if (index > -1) {
    a[index] = { ...a[index], value: [...a[index].value, b.value] }
  } else {
    a.push({ name: b.name, value: [b.value] })
  }
  return a
}, [])
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题