группировка вложенного списка с помощью подчеркивания groupBy

#javascript #underscore.js

#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]}
]
  

Комментарии:

1. Откуда берется 4, также результатом являются недопустимые данные.

Ответ №1:

Если вы ожидаете следующего результата

 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);
})  

Ответ №2:

Вы можете сделать это с помощью двух 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)  

Ответ №3:

Вы можете выполнить итерацию и выполнить поиск значений.

 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; }