合并2个对象数组

Ale*_*der 89 javascript arrays jquery

让我们看一个例子.

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Run Code Online (Sandbox Code Playgroud)

我需要合并这2个对象数组并创建以下数组.

arr3 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'});
Run Code Online (Sandbox Code Playgroud)

有没有jScript或jQuery函数来做到这一点?

$ .extend不适合我.它回来了

arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Run Code Online (Sandbox Code Playgroud)

先谢谢,亚历山大.

Jah*_*lam 65

如果要在JavaScript中合并2个对象数组.你可以使用这一行技巧

Array.prototype.push.apply(arr1,arr2);

例如

var arr1 = [{name: "lang", value: "English"},{name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

Array.prototype.push.apply(arr1,arr2); 

console.log(arr1);  // final merged result will be in arr1
Run Code Online (Sandbox Code Playgroud)

输出:

[{"name":"lang","value":"English"},
{"name":"age","value":"18"},
{"name":"childs","value":"5"},
{"name":"lang","value":"German"}]
Run Code Online (Sandbox Code Playgroud)

  • 结果更简单:`arr1 = arr1.concat(arr2)` (13认同)
  • 这不能回答问题,结果数组应该有3个对象,而不是4个。您更改了样本值。基本上,OP希望合并两个对象数组并删除重复的值。 (3认同)
  • 但这不是合并! (2认同)
  • 结果是不一样的。`concat` 将返回一个新数组并破坏您拥有的任何引用。 (2认同)

bob*_*bob 30

对于那些正在尝试现代事物的人:

var odd = [
    { name : "1", arr: "in odd" },
    { name : "3", arr: "in odd" }
];

var even = [
    { name : "1", arr: "in even" },
    { name : "2", arr: "in even" },
    { name : "4", arr: "in even" }
];

// ----
// ES5 using Array.filter and Array.find
function merge(a, b, prop){
  var reduced = a.filter(function(aitem){
      return ! b.find(function(bitem){
          return aitem[prop] === bitem[prop];
      });
  });
  return reduced.concat(b);
}
console.log( "ES5", merge(odd, even, "name") );

// ----
// ES6 arrow functions
function merge(a, b, prop){
    var reduced =  a.filter( aitem => ! b.find ( bitem => aitem[prop] === bitem[prop]) )
  return reduced.concat(b);
}
console.log( "ES6", merge(odd, even, "name") );

// ----
// ES6 one-liner
var merge = (a, b, p) => a.filter( aa => ! b.find ( bb => aa[p] === bb[p]) ).concat(b);


console.log( "ES6 one-liner", merge(odd, even, "name") );

// Results
// ( stuff in the "b" array replaces things in the "a" array )
// [
//    {
//         "name": "3",
//         "arr": "in odd"
//     },
//     {
//         "name": "1",
//         "arr": "in even"
//     },
//     {
//         "name": "2",
//         "arr": "in even"
//     },
//     {
//         "name": "4",
//         "arr": "in even"
//     }
// ]
Run Code Online (Sandbox Code Playgroud)


YOU*_*YOU 26

var arr3 = [];
for(var i in arr1){
   var shared = false;
   for (var j in arr2)
       if (arr2[j].name == arr1[i].name) {
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr1[i])
}
arr3 = arr3.concat(arr2);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


小智 25

使用ES6,您可以如下轻松完成操作:

var arr1 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = [...arr1, ...arr2];
Run Code Online (Sandbox Code Playgroud)

输出:

    arr3 = [
      {"name":"lang","value":"German"},
      {"name":"age","value":"18"},
      {"name":"childs","value":"5"},
      {"name":"lang","value":"German"}
    ]
Run Code Online (Sandbox Code Playgroud)

  • 这并不能满足OP的需求,也不应有第二个对象包含{{name:'lang',value:'German'}` (7认同)
  • 这应该是最佳答案。 (4认同)
  • 我不知道该答案被投票的原因。@ daveanderson88想要的是不同的答案。 (2认同)

guy*_*uya 23

我总是从谷歌来到这里,我总是不满意答案.你回答很好,但使用underscore.js会更容易和更整洁

演示:http://jsfiddle.net/guya/eAWKR/

这是一个更通用的函数,它将使用对象的属性合并2个数组.在这种情况下,该属性是'名称'

const mergeByProperty = (target, source, prop) => {
  source.forEach(sourceElement => {
    let targetElement = target.find(targetElement => {
      return sourceElement[prop] === targetElement[prop];
    })
    targetElement ? Object.assign(targetElement, sourceElement) : target.push(sourceElement);
  })
}
var target /* arr1 */ = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var source /* arr2 */ = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

mergeByProperty(target, source, 'name');

console.log(target)
Run Code Online (Sandbox Code Playgroud)

[{name:"lang",value:"German"},{name:"age",value:"18"},{name:"childs",value:'5'}]

  • 在LOC中几乎完全相同,复杂性为@YOU的答案,除了这个慢得多(主要是由于额外的函数调用以及你的答案利用JS关联数组技巧来查找具有O(1)查找的项目的事实).除此之外,您还需要携带额外的库. (6认同)

And*_* D. 15

合并两个数组:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var result=arr1.concat(arr2);
// result: [{name: "lang", value: "English"}, {name: "age", value: "18"}, {name : "childs", value: '5'}, {name: "lang", value: "German"}]
Run Code Online (Sandbox Code Playgroud)

合并两个没有'name'重复值的数组:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var i,p,obj={},result=[];
for(i=0;i<arr1.length;i++)obj[arr1[i].name]=arr1[i].value;
for(i=0;i<arr2.length;i++)obj[arr2[i].name]=arr2[i].value;
for(p in obj)if(obj.hasOwnProperty(p))result.push({name:p,value:obj[p]});
// result: [{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]
Run Code Online (Sandbox Code Playgroud)


kni*_*lov 14

最简单的方法是使用一些ES6魔法:

合并两个重复项:

const a = [{a: 1}, {b: 2}]
const b = [{a: 1}]

const result = a.concat(b) // [{a: 1}, {b: 2}, {a: 1}]
Run Code Online (Sandbox Code Playgroud)

没有重复,它与上面的加号相同:

const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]

  • concat 不适用于不同性质的项目 (2认同)

bh4*_*4th 11

使用ES6扩展运算符非常简单:

const array1 = [{a: 'HI!'}, {b: 'HOW'}]
const array2 = [{c: 'ARE'}, {d: 'YOU?'}]

const mergedArray = [ ...array1, ...array2 ]
console.log('Merged Array: ', mergedArray)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]

  • 这应该是2019年公认的答案!在查看了投票数较高的其他答案后,我打算提出相同的解决方案!@Alexander 很容易错过,但请接受这个! (2认同)
  • 不正确。如果对象具有重复的属性,提问者特别希望替换它们,而不是简单地附加它们。 (2认同)

Vad*_*hev 6

另一个版本使用reduce() method:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

var arr = arr1.concat(arr2).reduce(function(prev, current, index, array){ 
   
   if(!(current.name in prev.keys)) {
      prev.keys[current.name] = index;
      prev.result.push(current);   
   } 
   else{
       prev.result[prev.keys[current.name]] = current;
   }  

   return prev;
},{result: [], keys: {}}).result;
  
document.getElementById("output").innerHTML = JSON.stringify(arr,null,2);    
Run Code Online (Sandbox Code Playgroud)
<pre id="output"/>
Run Code Online (Sandbox Code Playgroud)


Pie*_*tro 6

用lodash:

_.uniqBy([...arr1, ...arr2], 'name')
Run Code Online (Sandbox Code Playgroud)


mar*_*tuk 6

这就是我在ES6环境中解决类似问题的方法:

function merge(array1, array2, prop) {
    return array2.map(function (item2) {
        var item1 = array1.find(function (item1) {
            return item1[prop] === item2[prop];
        });
        return Object.assign({}, item1, item2);
    });
}
Run Code Online (Sandbox Code Playgroud)

注意:此方法不会返回array1中未出现在array2中的任何项.


编辑:我有一些场景,我想保留第二个数组中没有出现的项目,所以我提出了另一种方法.

function mergeArrays(arrays, prop) {
    const merged = {};

    arrays.forEach(arr => {
        arr.forEach(item => {
            merged[item[prop]] = Object.assign({}, merged[item[prop]], item);
        });
    });

    return Object.values(merged);
}

var arr1 = [
    { name: 'Bob', age: 11 },
    { name: 'Ben', age: 12 },
    { name: 'Bill', age: 13 },
];

var arr2 = [
    { name: 'Bob', age: 22 },
    { name: 'Fred', age: 24 },
    { name: 'Jack', age: 25 },
    { name: 'Ben' },
];

console.log(mergeArrays([arr1, arr2], 'name'));
Run Code Online (Sandbox Code Playgroud)


dgk*_*nca 6

我会将两个数组与重复项合并,然后使用我的这个答案来删除重复项。这看起来像最短的路。

const arr1 = [{
    name: "lang",
    value: "English"
  },
  {
    name: "age",
    value: "18"
  }
];

const arr2 = [{
    name: "childs",
    value: '5'
  },
  {
    name: "lang",
    value: "German"
  }
];

const mergedArray = [...arr1, ...arr2];
const uniqueData = [...mergedArray.reduce((map, obj) => map.set(obj.name, obj), new Map()).values()];

console.log(uniqueData)
Run Code Online (Sandbox Code Playgroud)


Sha*_*pta 5

简单的解决方案

var tx = [{"id":1},{"id":2}];
var tx1 = [{"id":3},{"id":4}];


var txHistory = tx.concat(tx1)

console.log(txHistory); 
// output
 // [{"id":1},{"id":2},{"id":3},{"id":4}];
Run Code Online (Sandbox Code Playgroud)


xgq*_*rms 5

jsut 使用 vanilla js(ES6 版本)

// no need new Array constructor, just using an array literal
const arr1 = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
const arr2 = [{name: "childs", value: '5'}, {name: "lang", value: "German"}];

// 1. create a map
const map = new Map();

// 2. concat array
// arr1.concat(arr2) === [...arr1, ...arr2]
const arr3 = [...arr1, ...arr2];

// 3. for ... of, iterator array
for(const obj of arr3) {
  if(!map.has(obj.name)) {
    // add
    map.set(obj.name, obj);
  } else {
    // update
    map.set(obj.name, {
      ...map.get(obj.name),
      ...obj,
    });
  }
}

// 4. get new merged unqiue array
const arr4 = [...map.values()];

console.log(`result array =`, JSON.stringify(arr4, null, 4));

/*

result array = [
    {
        "name": "lang",
        "value": "German"
    },
    {
        "name": "age",
        "value": "18"
    },
    {
        "name": "childs",
        "value": "5"
    }
]

*/
Run Code Online (Sandbox Code Playgroud)

测试 ?(铬合金)

在此处输入图片说明

参考

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#array_literals


Xha*_*ent 1

在我的脑海中 - 尝试jquery扩展

var arr3 = jQuery.extend(arr1,arr2....)
Run Code Online (Sandbox Code Playgroud)