2010-12-04 7 views
1

J'ai un tableau de javascript objets comme les suivants:Mise à jour un tableau d'objets en javascript

var food = [ 
    {id: 1, name: 'Apples', owned: true }, 
    {id: 2, name: 'Oranges', owned: false }, 
    {id: 3, name: 'Bananas', owned: true } 
]; 

Ensuite, je reçois un autre tableau avec les données suivantes:

var newFood = [ 
    {id: 1, name: 'Peas'}, 
    {id: 2, name: 'Oranges'}, 
    {id: 3, name: 'Bananas'}, 
    {id: 4, name: 'Grapefruits'} 
]; 

Comment puis-je mettre à jour le précédent food tableau avec les nouvelles informations dans newFeed, sans en écrasant la propriété originale owned, tout en ajoutant un owned: false à un nouvel objet? Gardez à l'esprit qu'il s'agit d'un javascript ordinaire, pas de jQuery.

Répondre

5

Vous auriez probablement envie de nourriture d'index par identifiant donc faire de la nourriture un objet au lieu d'un tableau:

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

puis itérer sur newFood et mettre à jour les champs correctement.

0

Cela fonctionne:

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

La première déclaration for remplira l'objet temp avec les noms de fruits à partir du tableau food, afin que nous sachions quels fruits existent en elle. Dans ce cas, temp sera ceci:

{ "Apples": true, "Oranges": true, "Bananas": true } 

Ensuite, le second for contrôle des états pour chaque fruit dans newFood si ce fruit existe dans temp, et si elle ne le fait pas, si pousse un nouvel élément de tableau dans la food tableau.

0

quelque chose comme ça? 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

Je pense que vous pouvez utiliser pour underscore.js résoudre le problème.

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