在javascript中更新对象数组

时间:2010-12-04 00:10:17

标签: 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属性,同时添加{{1任何新对象?

请记住,这是简单的javascript,而不是jQuery。

4 个答案:

答案 0 :(得分:5)

你可能想要通过id索引食物,所以把食物变成对象而不是数组:

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

然后迭代newFood并适当更新字段。

答案 1 :(得分: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);

答案 2 :(得分: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 } 

然后,第二个for语句检查newFood中的每个水果,如果该水果存在于temp中,如果不存在,则检查新的数组项是否{ {1}}数组。

答案 3 :(得分: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];
        }
    }
}