更新或向列表添加值

时间:2016-10-15 19:20:09

标签: javascript

如何更新inventory(基于名称)或添加名称未找到。

var inventory = [
    {name: 'apples', quantity: 2},
    {name: 'bananas', quantity: 0},
    {name: 'cherries', quantity: 5}
];

例如,以下内容将更新广告资源:

const fruit = {name: 'bananas', quantity: 1}
inventory = inventory.map(f => f.name===fruit.name ? fruit : f);

这可以用来添加到库存中:

const fruit = {name: 'oranges', quantity: 2}
if (!inventory.find(f => f.name===fruit.name)) inventory.push(fruit)

但是我正在寻找一种可以兼顾两者的解决方案,如果可能的话,最好使用箭头功能而不是索引。

2 个答案:

答案 0 :(得分:5)

您可以使用findIndex

var idx = inventory.findIndex(f => f.name === fruit.name);
inventory[idx < 0 ? inventory.length : idx] = fruit;

&#13;
&#13;
var inventory = [
    {name: 'apples', quantity: 2},
    {name: 'bananas', quantity: 0},
    {name: 'cherries', quantity: 5}
];

var fruit = {name: 'bananas', quantity: 1}

var idx = inventory.findIndex(f => f.name === fruit.name);
inventory[idx < 0 ? inventory.length : idx] = fruit;

var fruit = {name: 'oranges', quantity: 2}

var idx = inventory.findIndex(f => f.name === fruit.name);
inventory[idx < 0 ? inventory.length : idx] = fruit;

console.log(inventory);
&#13;
&#13;
&#13;

如果您想要合并两个对象数组(而不是单个对象到数组),那么这种方法将是二次方的。您应该看到JavaScript merging objects by id

答案 1 :(得分:0)

如果您没有任何理由使用数字为库存编制索引,则应将对象用作字典。 E.g:

&#13;
&#13;
var inventory = {
    apples: { quantity: 2 },
    bananas: { quantity: 0 },
    cherries: { quantity: 5 }
};
let prop = "apples"
if (inventory.hasOwnProperty(prop))
  inventory[prop].quantity++;
else inventory[prop] = { quantity: 1 };
&#13;
&#13;
&#13;

如果你的索引不使用数字或字符串,那么现代javascript就有Map

如果数组必须保持原样,那么还有可能在库存上放置一个额外的索引结构。请小心包装结构以确保两者同时更新。

最后但至少,如果你想要一个数组,并确保库存总是很小,无论搜索功能多么糟糕,搜索时间都可以忽略不计,只需迭代数组(如其他答案中所述)