假设我在Javascript中有两个对象数组:
var myList = [{id: 3, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}];
var newList = [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}];
我现在想要"合并"将newList
转换为myList
,意思是:
myList
中已存在ID的所有对象应替换为newList
中的对象myList
中不存在ID的所有对象应从newList
添加到myList
但是我不明白,我如何检查具有特定id的对象是否已经在数组中。我想你可以为newList中的每个项目对myList进行循环,但这不是很可扩展。
有人知道我怎样才能有效地做到这一点?欢迎所有提示!
答案 0 :(得分:1)
您可以使用对象来确保ID是唯一的,这会自动覆盖现有ID,然后将其转换回数组
var myList = [{id: 5, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}];
var newList = [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}];
var o = {};
var newArr = [];
myList.forEach(function(x) {
o[x.id] = x;
});
newList.forEach(function(x) {
o[x.id] = x;
});
for (var key in o) {
newArr.push(o[key])
}
document.body.innerHTML = '<pre>' + JSON.stringify(newArr, null, 4) + '</pre>';
&#13;
答案 1 :(得分:1)
尝试:
function combineArray(array1, array2) {
var arr = array1.concat(array2);
for(var i = 0; i < arr.length; ++i) {
for(var j = i + 1; j < arr.length; ++j) {
if(arr[i].id === arr[j].id)
arr.splice(i, 1);
}
}
return arr;
};
然后
combineArray([{id: 3, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}], [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}] );
返回
[Object { id=97, info="ble"}, Object { id=25, info="blu"}, Object { id=5, info="blo"}, Object { id=3, info="different Info!!"}]
答案 2 :(得分:0)
我很遗憾地说,你必须做一些比较来比较你的ID。 您可以对第一个对象数组进行迭代,以获取每个元素的ID属性。在这个itteration中,您可以在合并数组上进行另一次迭代,比较值并将您想要的值推送到新的&#34;结果&#34;阵列。
也许这可以帮助您使用嵌套的itterations保持代码整洁:
Find a value in an array of objects in Javascript
希望这会有所帮助。
答案 3 :(得分:0)
如果newList
包含具有此ID的对象,您可以循环检查myList
。如果是,请使用splice
替换新旧对象,否则将新对象推送到myList
。
var myList = [{id: 3, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}];
var newList = [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}];
newList.forEach(function(el) {
var found = myList.filter(function(obj) {
return obj.id == el.id;
});
if (found.length) {
myList.splice(myList.indexOf(found[0]), 1, el);
}
else {
myList.push(el);
}
});
alert( JSON.stringify(myList, null, '\t') );
答案 4 :(得分:0)
您可以使用array.prototype.concat()
和array.prototype.filter()
方法进行此操作..
var myList = [{id: 3, info: 'bla'}, {id: 97, info: 'ble'}, {id: 25, info: 'blu'}];
var newList = [{id: 5, info: 'blo'}, {id: 3, info: 'different Info!!'}];
var temp = {};
var output = newList.concat(myList).filter(function(v){
if (temp[v.id]){
return false;
}
temp[v.id] = true;
return true;
});
console.log(output);