2010-12-04 51 views
1

我有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。

回答

5

你可能想索引的食物通过ID,以便使食物的对象,而不是数组:

var food = { 
1: {name: "Apples", owned: true}, 
//... 
} 

然后遍历newFood并适当更新的字段。

0

这工作:

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数组。

0

有这样的事吗? 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]; 
     } 
    } 
} 
3

我认为你可以使用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);