使用groupBy下划线对嵌套列表进行分组

时间:2016-09-29 11:08:36

标签: javascript underscore.js

我有一个清单

 data = [{
        value1:[1,2],
        value2:[{type:'A'}, {type:'B'}]
    },{
        value1:[3,5],
        value2:[{type:'B'}, {type:'B'}]
    }]

这是我的列表格式,我想将此列表格式化为

data = [
    {type:'A', value: [1,2]},
    {type:'B', value: [3,5]}
]

3 个答案:

答案 0 :(得分:0)

如果您期望以下结果

data = [
    {type:'A', value: [1,2]},
    {type:'B', value: [3,5]}
]

这就是你想要的

 data = [{
        value1:[1,2],
        value2:[{type:'A'}, {type:'B'}]
    },{
        value1:[3,5],
        value2:[{type:'B'}, {type:'B'}]
    }]
 

data.forEach(function(item, index){
  var obj = {};
  obj.type = item.value2[0].type;
  obj.value = item.value1;
  console.log(obj);
})

答案 1 :(得分:0)

您可以使用两个forEach()循环执行此操作,并在第一个thisArg循环中将对象作为forEach()参数。



var data = [{
  value1: [1, 2],
  value2: [{
    type: 'A'
  }, {
    type: 'B'
  }]
}, {
  value1: [3, 5],
  value2: [{
    type: 'B'
  }, {
    type: 'B'
  }]
}]


var result = [];
data.forEach(function(o, i) {
  var that = this;
  o.value2.forEach(function(t) {
    if (!that[t.type]) {
      that[t.type] = {
        type: t.type,
        value: []
      }
      result.push(that[t.type]);
    }
    if (!that[i + '|' + t.type]) {
      that[t.type].value = that[t.type].value.concat(o.value1);
      that[i + '|' + t.type] = true;
    }
  })
}, {})

console.log(result)




答案 2 :(得分:0)

您可以迭代并查找值。

var data = [{ value1: [1, 2], value2: [{ type: 'A' }, { type: 'B' }] }, { value1: [3, 5], value2: [{ type: 'B' }, { type: 'B' }] }],
    grouped = [];

data.forEach(function (a) {
    a.value2.forEach(function (b) {
        if (!this[b.type]) {
            this[b.type] = { type: b.type, value: [] };
            grouped.push(this[b.type]);
        }
        a.value1.forEach(function (c) {
            if (this[b.type].value.indexOf(c) < 0) {
                this[b.type].value.push(c);
            }
        }, this);
    }, this);
}, Object.create(null));

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }