比较对象数组和对象并减少数量

时间:2019-04-08 15:03:47

标签: javascript ecmascript-6

我有一个对象,其中包含一个id作为键,并包含数量作为值,例如;

let order = {1002: 2, 1010: 1}

我想将订单对象与一系列产品进行比较,例如:

let stock = [{name: "test", id: "1002", quantity: 100}, {name: "moreTest", id: "1010", quantity: 100}]

我要根据股票对象中的相应值来减少股票数组中每个对象的数量,例如:

 let newStock = [{name: "test", id: "1002", quantity: 98}, {name: "moreTest", id: "1010", quantity: 99}]

3 个答案:

答案 0 :(得分:0)

这里是一种单线方法:

let newStock = stock.map(item => ({...item, quantity: item.quantity - (order[parseInt(item.id,10)] || 0)}))

顺便说一句:

  1. 我认为股票的id应该是一个数字(或订单需要一个字符串键-我使用parseInt,但我认为这不是最佳做法)。
  2. 股票也应该是一张地图,以防止多个具有相同ID的股票。

答案 1 :(得分:0)

这是一个可能的解决方案,非常清楚:

let order = {1002: 2, 1010: 1}
let stock = [{name: "test", id: "1002", quantity: 100}, {name: "moreTest", id: "1010", quantity: 100}]

stock.forEach(element => {
    Object.keys(order).forEach(function(key) {
        const quantityBought = order[key];
        // == and not === because element.id is a string and key is a number
        if (element.id == key) {
            element.quantity -= quantityBought;
        }
    });
});

console.log(stock);

答案 2 :(得分:0)

您可以在这里使用Array.prototype.reduce这样的东西

let stock = [{name: "test", id: "1002", quantity: 100}, {name: "moreTest", id: "1010", quantity: 100}]

let order = {1002: 2, 1010: 1}

let result=stock.reduce((acc,value)=>{
value.quantity=value.quantity-order[value.id];
acc.push(value);
return acc;


},[])
console.log(result)

作为参考,请查看mozilla docs中的数组归约函数