如何更新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)
但是我正在寻找一种可以兼顾两者的解决方案,如果可能的话,最好使用箭头功能而不是索引。
答案 0 :(得分:5)
您可以使用findIndex
:
var idx = inventory.findIndex(f => f.name === fruit.name);
inventory[idx < 0 ? inventory.length : idx] = fruit;
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;
如果您想要合并两个对象数组(而不是单个对象到数组),那么这种方法将是二次方的。您应该看到JavaScript merging objects by id。
答案 1 :(得分:0)
如果您没有任何理由使用数字为库存编制索引,则应将对象用作字典。 E.g:
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;
如果你的索引不使用数字或字符串,那么现代javascript就有Map。
如果数组必须保持原样,那么还有可能在库存上放置一个额外的索引结构。请小心包装结构以确保两者同时更新。
最后但至少,如果你想要一个数组,并确保库存总是很小,无论搜索功能多么糟糕,搜索时间都可以忽略不计,只需迭代数组(如其他答案中所述)