Javascript: 数据对象合并

Javascript: Data Object merging

我想知道是否有办法合并一个对象中具有相同元素的元素 属性。

我的意思是:

var dummy = {
 data: [
     {name: 'A', info: '1'},
     {name: 'B', info: 'A'},
     {name: 'C', info: '2'},
     {name: 'A', info: '2'},
     {name: 'B', info: '2'}

  ]
};

var expected_results = {
 data: [
  {name: 'A', info: '1,2'},
  {name: 'B', info: 'A,2'},
  {name: 'C', info: '2'}
 ]
}

//Todo if same name merge if not seperate
var plugin = {
 unique: {
    list: []
 },
  merge: function(params) {
   var lists = plugin.unique.list;
   lists.push(params[0]); //First always unique
   $.each(params, function(index, item) {
      if(index !== 0) {
         $.each(lists, function(index, list) {
            if(list.name === item.name) {
               list.info += ',' + item.info;
            } else {
               lists.push(item);
            }
         })
      }
   })
   return lists;
  }
 };

console.clear();
var list = plugin.merge(dummy.data);
console.log('result',list);

我想我已经接近了,但不太确定我的循环哪里出了问题...:(

老实说,如果您要按键分组,您最好使用对象而不是数组作为返回的数据结构。更容易操作。

function squish(dummy) {

  // pass in an initial empty object
  // if the key isn't there, create it and use an array
  // as a value - push in the value
  var out = dummy.data.reduce(function (p, c) {
    if (!p[c.name]) p[c.name] = [];
    p[c.name].push(c.info);
    return p;
  }, {});

  // flatten the arrays for each key
  Object.keys(out).forEach(function (el) {
    out[el] = out[el].join(',');
  });

  // return the expected_result
  return out;
}

squish(dummy);

DEMO

输出

{
  "A": "1,2",
  "B": "A,2",
  "C": "2"
}

但是,如果您真的想要一个对象数组,那也很简单:

function squish2(dummy) {
  var out = dummy.data.reduce(function (p, c) {
    if (!p[c.name]) p[c.name] = [];
    p[c.name].push(c.info);
    return p;
  }, {});
  return Object.keys(out).map(function (el) {
    return { name: el, info: out[el].join(',') };
  });
}

DEMO

输出

[
  { "name": "A", "info": "1,2" },
  { "name": "B", "info": "A,2" },
  { "name": "C", "info": "2" }
]