如果键相等,则在JS对象中添加值

时间:2018-08-25 12:28:54

标签: javascript arrays object

我有这个数组对象

[
  {
    package_size: 12,
    qty: 24
  },
  {
    package_size: 24,
    qty: 60
  }
]

我正在尝试做的事情:

如果我在此数组中添加了另一个对象,并且它的值与任何package_size相等,例如,如果我想添加 package_size:12 && qty:50 ,则第一个元素数组中的内容变为:

[
  {
    package_size: 12,
    qty: 74
  },
  {
    package_size: 24,
    qty: 60
  }
]

2 个答案:

答案 0 :(得分:0)

您可以实现将数组变成字典并使用化简器的目的

let items = [
  {
    package_size: 12,
    qty: 24
  },
  {
    package_size: 24,
    qty: 60
  },
  {
    package_size: 12,
    qty: 50
  },
];

// Transform the array into a dictionnary
items = items.reduce((acc, item) => {
  const key = item.package_size;
  acc[key] = acc[key] || 0;
  acc[key] += item.qty;
  return acc;
}, Object.create(null));

// Transform dictionnary into an array
const mergedItems = [];
Object.keys(items).forEach((key) => {
  mergedItems.push({
    package_size: key,
    qty: items[key]
  });
});

console.log(mergedItems);

答案 1 :(得分:0)

在评论中已经提到.find是您的朋友。您可以使用自定义添加功能将新项目添加到数组。

let items = [
  {
    package_size: 12,
    qty: 24
  },
  {
    package_size: 24,
    qty: 60
  }
];

let addItem = (item) => {
  let slot = items.find(e => e.package_size == item.package_size);
  if (slot) {
    slot.qty += item.qty;
  } else {
    items.push(item);
  }
};

addItem({package_size: 12, qty: 10});
console.log(items);
addItem({package_size: 13, qty: 1});
console.log(items);