更新对象的阵列中的JavaScript
问题描述:
我有javascript对象的像的数组以下:更新对象的阵列中的JavaScript
var food = [
{id: 1, name: 'Apples', owned: true },
{id: 2, name: 'Oranges', owned: false },
{id: 3, name: 'Bananas', owned: true }
];
然后我接收与下列数据的另一数组:
var newFood = [
{id: 1, name: 'Peas'},
{id: 2, name: 'Oranges'},
{id: 3, name: 'Bananas'},
{id: 4, name: 'Grapefruits'}
];
如何更新的以前的food
数组中有新的信息newFeed
,没有覆盖原来的owned
属性,同时增加owned: false
到任何新的对象?
请记住,这是纯javascript,而不是jQuery。
答
你可能想索引的食物通过ID,以便使食物的对象,而不是数组:
var food = {
1: {name: "Apples", owned: true},
//...
}
然后遍历newFood并适当更新的字段。
答
这工作:
var temp = {};
for (var i = 0, l = food.length; i < l; i += 1) {
temp[food[i].name] = true;
}
for (var i = 0, l = newFood.length; i < l; i += 1) {
if (!temp[newFood[i].name]) {
food.push({ id: food.length + 1, name: newFood[i].name, owned: false });
}
}
第一for
语句将填充temp
对象从food
阵列水果的名称,让我们知道哪些水果在它存在。在这种情况下,temp
将是这样的:
{ "Apples": true, "Oranges": true, "Bananas": true }
然后,在newFood
如果存在temp
水果,而第二for
语句检查每种水果如果没有,如果将一个新的数组项进入food
数组。
答
有这样的事吗? JSFiddle Example
的JavaScript
function updateFood(newFood, oldFood) {
var foodLength = oldFood.length - 1;
for (var i = 0; i < newFood.length; i++) {
if (i > foodLength) { //add more if needed
newFood[i].owned = false;
oldFood.push(newFood[i]);
} else if (!food[i].owned) { //replace if needed
newFood[i].owned = false;
oldFood[i] = newFood[i];
}
}
}
答
我认为你可以使用underscore.js为解决这个问题。
var arrayObj = [
{Name:'John',LastName:'Smith'},
{Name:'Peter',LastName:'Jordan'},
{Name:'Mike',LastName:'Tyson'}
];
var element = _.findWhere(arrayObj, { Name: 'Mike' });
element.Name="SuperMike";
console.log(arrayObj);