Добавление значения в объект JS, если ключи равны - PullRequest
0 голосов
/ 25 августа 2018

У меня есть этот объект массива

[
  {
    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 голосов
/ 25 августа 2018

Как уже упоминалось в комментариях .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);
0 голосов
/ 25 августа 2018

Вы можете достичь желаемого, превратив массив в словарь и используя редуктор

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...