从Objects加入相同的属性值

时间:2015-09-07 11:17:11

标签: javascript arrays

我有一个对象数组,我想知道连接类似属性值的最佳方法,例如。

arr:[
      {obj:{obj_type:1, obj_foo:"joe"}}, 
      {obj:{obj_type:2, obj_foo:"developer"}}, 
      {obj:{obj_type:1, obj_foo:"kevin"}}, 
      {obj:{obj_type:2, obj_foo:"architect"}}
]

我需要连接相同obj_type属性的属性值。 预期结果应为:

arr:[
      {obj:{obj_type:1, obj_foo:"joe|kevin"}}, 
      {obj:{obj_type:2, obj_foo:"developer|architect"}}
]

即。值基于obj_type连接。

3 个答案:

答案 0 :(得分:2)

我认为这样的代码可能对您有所帮助:

//Objects to work with:
var arr = [{obj:{obj_type:1, obj_foo:"joe"}},
          {obj:{obj_type:2, obj_foo:"developer"}},
          {obj:{obj_type:1, obj_foo:"kevin"}},
          {obj:{obj_type:2, obj_foo:"architect"}}];
//Map from obj_type to {obj: …} objects:
var map = {};
//Iterating arr:
for(var i = 0; i < arr.length; i++){
  var o = arr[i], type = o.obj.obj_type;
  if(type in map){
    map[type].obj.obj_foo += '|' + o.obj.obj_foo;
  }else{
    map[type] = o;
  }
}
//Putting map values to arr:
arr = [];
for(var key in map){
  arr.push(map[key]);
}
//Done:
console.log(arr);

生成的输出如下所示:

  

[{obj:{obj_type:1,obj_foo:&#39; joe | kevin&#39; },     {obj:{obj_type:2,obj_foo:&#39;开发人员|建筑师&#39; }}]

答案 1 :(得分:1)

此变体不会更改初始数组的内容。

var types = {};
var newArr = [];
var type, newObj;

for ( var i = 0; i < arr.length; ++i ) {
    type = arr [ i ].obj.obj_type;
    if ( type in types ) {
        types[ type ].obj.obj_foo += '|' + arr[ i ].obj.obj_foo;
    } else {
        newObj = {
            obj: {
                obj_type: arr[ i ].obj.obj_type,
                obj_foo: arr[ i ].obj.obj_foo
            }
        };
        types[ type ] = newObj;
        newArr.push( newObj );
    }
}

return newArr; // result array

答案 2 :(得分:0)

这可能是最简单的方法:

// Your array
var arr = [
  {obj:{obj_type:1, obj_foo:"joe"}}, 
  {obj:{obj_type:2, obj_foo:"developer"}}, 
  {obj:{obj_type:1, obj_foo:"kevin"}}, 
  {obj:{obj_type:2, obj_foo:"architect"}}
];

// Loop over all elements
for(var i = 0; i < arr.length; i++) {
  var a = arr[i].obj;
  // Compare to each other element
  for(var j = i + 1; j < arr.length; j++) {
    var b = arr[j].obj;
    // If the obj_type is equal...
    if(a.obj_type === b.obj_type) {
      // Merge data...
      a.obj_foo += '|' + b.obj_foo;
      // Remove other element
      arr.splice(j--, 1);
    }
  }
}

输出(来自node.js):

[ { obj: { obj_type: 1, obj_foo: 'joe|kevin' } },
  { obj: { obj_type: 2, obj_foo: 'developer|architect' } } ]