合并2个对象数组


112

让我们看一个例子。

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

我需要合并对象的这两个数组并创建以下数组:

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

有没有JavaScript或jQuery函数可以做到这一点?

$.extend不适合我。它返回

arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

15
发生了什么事{name: "lang", value: "English"}
暗影巫师为您耳边

抱歉。我提到$ .extend,而不是$ .merge。
亚历山大

1
我的意思是,涉及的逻辑是什么?您想如何合并数组?从您的示例尚不清楚。
暗影巫师为您耳边

非常感谢大家。我是手动完成的。
亚历山大

6
@ShadowWizard,我认为OP的意思是如果存在则进行更新,如果不存在则进行推送。
阿敏·穆罕默德·阿贾尼

Answers:


83

如果要在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

输出:

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

到目前为止,这是最简单的用法,效果很好。感谢分享。
Leo Caseiro '16

17
与更简单的结果相同:arr1 = arr1.concat(arr2)
keithpjolley's

7
但这不是合并!
Dimitri Kopriwa

1
结果不一样。concat将返回一个新数组并中断您拥有的所有引用。
Bpainter

8
这不能回答问题,结果数组应该有3个对象,而不是4个。您更改了样本值。基本上,OP希望合并两个对象数组并删除重复的值。
Ranjan

43

使用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];

输出:

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

6
这应该是最佳答案。
nocdib

19
这不会做什么的OP一直在寻找,不应该有包含第二个对象{ name: 'lang', value: 'German'}
威尔

3
我不知道该答案被投票的原因。@ daveanderson88想要的是不同的答案。
阮春晃

33

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

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"
//     }
// ]

29

更新2019年10月12日

仅基于较新的Javascript的新版本,而无需任何第三方库。

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)

这个答案越来越老了,如今越来越不需要像lodash和unders下的lib。在这个新版本中,目标(arr1)数组是我们正在使用的数组,并且希望保持最新状态。该源(ARR2)阵列是在新的数据是从哪里来的,我们希望它融入我们的目标阵列。

我们遍历数组以查找新数据,对于在目标数组中尚未找到的每个对象,我们只需使用target.push(sourceElement)添加该对象, 如果基于我们的键属性('name'), object已经在目标数组中-我们使用Object.assign(targetElement,sourceElement)更新其属性和值。我们的“目标”将始终是相同的数组并具有更新的内容。


使用下划线或破折号的旧答案

我总是从Google到达这里,而我总是对答案不满意。您的回答很好,但是使用underscore.js会更轻松更整洁

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

这是一个更通用的函数,它将使用其对象的属性合并两个数组。在这种情况下,属性为“名称”

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

function mergeByProperty(arr1, arr2, prop) {
  _.each(arr2, function(arr2obj) {
    var arr1obj = _.find(arr1, function(arr1obj) {
      return arr1obj[prop] === arr2obj[prop];
    });

    arr1obj ? _.extend(arr1obj, arr2obj) : arr1.push(arr2obj);
  });
}

mergeByProperty(arr1, arr2, 'name');

console.log(arr1);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.min.js"></script>

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

6
LOC的复杂度几乎与@YOU的答案相同,除了它的速度要慢得多(很大程度上是由于额外的函数调用以及YOU的答案利用JS关联数组技巧来查找带有O(1)查找的项)。此外,您还需要带一个附加的库。
Mrchief 2015年

除非您要处理极端情况,否则性能不会有任何差异。关于额外的lib-下划线,lodash等已被普遍使用并具有其他好处,无论如何都应考虑使用它。大多数开发人员和应用程序将从此解决方案的简单性和通用性中受益。
guya 2015年

1
@guya我意识到这已经很老了,下划线,lodash等已被普遍使用并具有其他好处,而正如您所说的,它们还有其他好处,这是一个很大的假设,认为它们已被普遍使用。
Craicerjack

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

在此处输入图片说明


1
该答案的时间复杂度很差(O(n ^ 2))。使用哈希映射可以实现O(n)解决方案。
Alex von Brandenfels

17

使用ES6传播算子非常简单:

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

const mergedArray = [ ...array1, ...array2 ]
console.log('Merged Array: ', mergedArray)
<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>

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

注意:上述解决方案是仅使用ES6扩展运算符合并两个阵列。

@ bh4r4th于2020年1月7日 进行编辑由于我的初始解决方案后由于编辑而导致上下文发生更改。我想更新我的解决方案以符合当前标准。即

  1. 合并数组对象而不创建重复的对象,并且

  2. value如果name属性在先前的数组中已经存在,则更新

const arr1 = [
    { name: "lang", value: "English" },
    { name: "age", value: "18" }
]
const arr2 = [
    { name: "childs", value: '2' }, 
    { name: "lang", value: "German" }
]
const arr3 = [
    { name: "lang", value: "German" },
    { name: "age", value: "28" },
    { name: "childs", value: '5' }
]

// Convert to key value dictionary or object
const convertToKeyValueDict = arrayObj => {
    const val = {}
    arrayObj.forEach(ob => {
        val[ob.name] = ob.value
    })
    return val
}

// update or merge array
const updateOrMerge = (a1, a2) => {
    const ob1 = convertToKeyValueDict(a1)
    const ob2 = convertToKeyValueDict(a2)
    // Note: Spread operator with objects used here
    const merged_obj = {...ob1, ...ob2}
    const val = Object.entries(merged_obj)
    return val.map(obj => ({ name: obj[0], value: obj[1] }))
}

const v1 = updateOrMerge(arr1, arr2)
const v2 = updateOrMerge(v1, arr3)
console.log(`Merged array1 and array2: ${JSON.stringify(v1)} \n\n`)
console.log(`Merged above response and array3: ${JSON.stringify(v2)} \n\n`)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>


1
这应该是2019年可接受的答案!在查看其他具有较高投票数的答案之后,我将提出相同的解决方案!@Alexander很容易错过,但是请接受这个!
iaforek

不正确 发问者特别想替换具有重复属性的对象,而不是简单地附加它们。
HaveSpacesuit

感谢您指出@HaveSpacesuit。当上下文仅合并两个数组时,我在2018年回答了这个问题。很快将编辑此答案以set在合并时使用以删除重复项。这将创建新的变量参数,但代码最少。但是,我不是负载的忠实拥护者,负载的名称定义为属性,值定义为不同的类型。相反,我更喜欢[ { lang: &#39;German&#39;, age: 25}] 。这样,在服务之间进行通信时,有效负载权重将最小化。
bh4r4th

我现在已经更新了解决方案以匹配问题的已更改上下文。
bh4r4th

16

合并两个数组:

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

合并两个名称不重复的数组:

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

Array.concat是将2个数组合并为一个数组的正确方法。我还喜欢扩展的假设,即解决了“ true”合并的概念(基于每个数组元素的给定键)。
鲍勃,

14

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

合并两个重复项:

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

const result = a.concat(b) // [{a: 1}, {b: 2}, {a: 1}]

如果没有重复,则与上述内容相同:

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


1
concat不适用于不同性质的商品
fdsfdsfdsfds

7

使用lodash:

_.uniqBy([...arr1, ...arr2], 'name')

ES6语法可用于2个数组,而不适用于2个对象数组。
达里奥

7

这就是我在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);
    });
}

注意:此方法不会从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'));

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);    
<pre id="output"/>


这对我来说很棒。一个小问题是,合并3个大型json对象时,排序有时很奇怪
crh225'9

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

4

您可以在替换重复项时使用一个对象收集您的属性,然后将该对象扩展/展平为数组。像这样:

function merge(args) {
    args  = Array.prototype.slice.call(arguments);
    var o = { };
    for(var i = 0; i < args.length; ++i)
        for(var j = 0; j < args[i].length; ++j)
            o[args[i][j].name] = args[i][j].value;
    return o;
}

function expand(o) {
    var a = [ ];
    for(var p in o)
        if(o.hasOwnProperty(p))
            a.push({ name: p, value: o[p]});
    return a;
}

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 arr3 = expand(merge(arr1, arr2));

我不知道这是否是最快的方法,但是它适用于任意数量的输入数组。例如,这:

var a = expand(
    merge(
        [{name: "lang", value: "English"}, {name: "age", value: "18"}],
        [{name: "childs", value: '5'}, {name: "lang", value: "German"}],
        [{name: 'lang', value: 'Pancakes'}]
    )
);

为您提供了同样的事情,a那是在arr3用“德国”代替“煎饼”。

此方法确实假定您的对象都具有相同的对象 {name: ..., value: ...}形式。

您可以在这里看到它的运行状态(请打开控制台):http : //jsfiddle.net/ambiguous/UtBbB/



2

遇到了同样的问题,并且根据Guya的回答,我扩展了下划线库,还添加了我所需要的更多功能。这是要点

/**
 * Merges two object-like arrays based on a key property and also merges its array-like attributes specified in objectPropertiesToMerge.
 * It also removes falsy values after merging object properties.
 *
 * @param firstArray The original object-like array.
 * @param secondArray An object-like array to add to the firstArray.
 * @param keyProperty The object property that will be used to check if objects from different arrays are the same or not.
 * @param objectPropertiesToMerge The list of object properties that you want to merge. It all must be arrays.
 * @returns The updated original array.
 */
function merge(firstArray, secondArray, keyProperty, objectPropertiesToMerge) {

    function mergeObjectProperties(object, otherObject, objectPropertiesToMerge) {
        _.each(objectPropertiesToMerge, function (eachProperty) {
            object[eachProperty] = _.chain(object[eachProperty]).union(otherObject[eachProperty]).compact().value();
        });
    }

    if (firstArray.length === 0) {
        _.each(secondArray, function (each) {
            firstArray.push(each);
        });
    } else {
        _.each(secondArray, function (itemFromSecond) {
            var itemFromFirst = _.find(firstArray, function (item) {
                return item[keyProperty] === itemFromSecond[keyProperty];
            });

            if (itemFromFirst) {
                mergeObjectProperties(itemFromFirst, itemFromSecond, objectPropertiesToMerge);
            } else {
                firstArray.push(itemFromSecond);
            }
    });
    }

    return firstArray;
}

_.mixin({
            merge: merge
        });

希望它有用!问候!


2

最近,我为这个问题感到难过,我带着希望的答案来到这里,但是被接受的答案使用2代表in in loops,这是我不希望的。我终于设法使自己的。完全不依赖任何库:

function find(objArr, keyToFind){
    var foundPos = objArr.map(function(ob){
        return ob.type;
    }).indexOf(keyToFind);
    return foundPos;
}

function update(arr1,arr2){
    for(var i = 0, len = arr2.length, current; i< len; i++){
        var pos = find(arr1, arr2[i].name); 
        current = arr2[i];
        if(pos !== -1) for(var key in arr2) arr1[pos][key] = arr2[key];
        else arr1[arr1.length] = current;
    } 
}

这也保持了arr1的顺序。


2

您可以使用以下功能

const merge = (a, b, key = "id") =>
  a.filter(elem => !b.find(subElem => subElem[key] === elem[key]))
   .concat(b);

并尝试

merge(arr1, arr2, 'name');

感谢具有ES6不变功能的Diago方法```export const mergeArrays =(a1,a2,key =“ id”)=> a1 && a2!= null吗?[... a1.filter(a =>!a2.find(p => p [key] === a [key]))),... a2]:空;```
穆萨

1

在这里,我首先arr1根据是否存在元素进行过滤arr2。如果存在,则不要将其添加到结果数组中,否则请添加。然后我附加arr2到结果中。

arr1.filter(item => {
  if (!arr2.some(item1=>item.name==item1.name)) {
    return item
  }
}).concat(arr2)

请提供答案的解释。因此,如果其他人阅读了该问题和答案,那么它很容易理解。
米塔尔·帕特尔

尽管此答案可能是正确且有用的,但如果您在其中包含一些解释以说明它如何帮助解决问题,则最好使用该答案。如果发生更改(可能不相关)导致它停止工作,并且用户需要了解它曾经如何工作,那么这在将来特别有用。
Erty Seidohl

感谢你们。我更新了解决方案说明。如果看来正确,请支持:)
maulik bhatt

0

不在我的头上-尝试扩展jQuery

var arr3 = jQuery.extend(arr1,arr2....)

抱歉。确切地说,此函数返回arr4。不是$ .merge。最后一个也不适合我,因为它复制了对象。
亚历山大


0

基于@YOU的答案,但保持顺序:

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

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

我知道此解决方案的效率较低,但是如果您想保留订单并仍然更新对象,则必须这样做。


0

这是我编写的jQuery插件,用于通过键合并两个对象数组。请记住,这将就地修改目标数组。

(function($) {
  $.extendObjectArray = function(destArray, srcArray, key) {
    for (var index = 0; index < srcArray.length; index++) {
      var srcObject = srcArray[index];
      var existObject = destArray.filter(function(destObj) {
        return destObj[key] === srcObject[key];
      });
      if (existObject.length > 0) {
        var existingIndex = destArray.indexOf(existObject[0]);
        $.extend(true, destArray[existingIndex], srcObject);
      } else {
        destArray.push(srcObject);
      }
    }
    return destArray;
  };
})(jQuery);

var arr1 = [
  { name: "lang",   value: "English" },
  { name: "age",    value: "18"      }
];
var arr2 = [
  { name: "childs", value: '5'       },
  { name: "lang",   value: "German"  }
];
var arr3 = $.extendObjectArray(arr1, arr2, 'name');

console.log(JSON.stringify(arr3, null, 2));
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


ES6版本

(function($) {
  $.extendObjectArray = (destArr, srcArr, key) => {
    srcArr.forEach(srcObj => (existObj => {
      if (existObj.length) {
        $.extend(true, destArr[destArr.indexOf(existObj[0])], srcObj);
      } else {
        destArr.push(srcObj);
      }
    })(destArr.filter(v => v[key] === srcObj[key])));
    return destArr;
  };
})(jQuery);

0

使用lodash你想要_.uniqBy

var arr3 = _.uniqBy(arr1.concat(arr2), 'name'); // es5

let arr3 = _.uniqBy([...arr1, ...arr2], 'name'); // es6

arr1,arr2的顺序很重要!

参见docs https://lodash.com/docs/4.17.4#uniqBy


需要使用第三方?
阮春晃

没有,但是它是实现它的最简洁的方法,它不仅是任何第三方,而且是lodash!
danday74 '19

0
const extend = function*(ls,xs){
   yield* ls;
   yield* xs;
}

console.log( [...extend([1,2,3],[4,5,6])]  );

2
只是不提供问题的答案。还说明此解决方案如何解决问题。
米塔尔·帕特尔

0
merge(a, b, key) {
    let merged = [];
    a.forEach(aitem => {
        let found = b.find( bitem => aitem[key] === bitem[key]);
        merged.push(found? found: aitem);
    });
    return merged;
}

0

如果要合并2个数组,但要删除重复的对象,请使用此方法。在.uniqueId每个对象上标识重复项

function mergeObjectArraysRemovingDuplicates(firstObjectArray, secondObjectArray) {
  return firstObjectArray.concat(
    secondObjectArray.filter((object) => !firstObjectArray.map((x) => x.uniqueId).includes(object.uniqueId)),
  );
}

0

试试这个:

var a = [{"a":20, "b":10,"c":"c","d":"asd","f":"any"}]
var b = [{"a":20, "b":10,"c":"c", "e":"nan","g":10200}]

var p = []
_.map(a, function(da){
var chk = _.filter(b, function(ds){
return da.a ===ds.a
})[0]
p.push(_.extend(da, chk))


})

console.log(p)

输出将是:

  [{
    "a": 20,
    "b": 10,
    "c": "c",
    "d": "asd",
    "f": "any",
    "e": "nan",
    "g": 10200
  }]

0
const arr1 = ["Vijendra","Singh"];
const arr2 = ["Singh", "Shakya"];

arr2.forEach(item => {
        if(!arr1.find(k => k===item))
          arr1.push(item)
    });


console.log(arr1)

0

利用JS Map的解决方案:

const merge = (arr1, arr2, prop) => {
    const resultMap = new Map([...arr1.map((item) => [item[prop], item])]);
    arr2.forEach((item) => {
        const mapItem = resultMap.get(item[prop]);
        if (mapItem) Object.assign(mapItem, item);
        else resultMap.set(item[prop], item);
    });
    return [...resultMap.values()];
};

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

console.log(merge(arr1, arr2, "name"));

产生:

merge()函数结果


0
const array1 = [{id:1,name:'ganza'},
{id:2,name:'respice dddd'},{id:4,name:'respice dddd'},{id:6,name:'respice dddd'},
{id:7,name:'respice dddd'}];
const array2 = [{id:1,name:'ganza respice'},{id:2,name:'respice'},{id:3,name:'mg'}];

 function mergeTwoArray(array1,array2){

    return array1.map((item,i)=>{
        if(array2[i] && item.id===array2[i].id){
          return array2[i];
          }else{
            return item;
          }
    });
  }

const result = merge(array1,array2);
console.log(result);
//here is the result:  Array [Object { id: 1, name: "ganza respice" }, Object { id: 2, name: "respice" }, Object { id: 4, name: "respice dddd" }, Object { id: 6, name: "respice dddd" }, Object { id: 7, name: "respice dddd" }]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.