Создание объектов из массивов с повторяющимися значениями - PullRequest
0 голосов
/ 13 января 2019

У меня есть массив с повторяющимися значениями:

[ ['Deer Skin', 1], ['Bear Skin', 1], ['Deer Skin', 1], ['Cougar Skin', 2] ... ]

Я хочу сравнить их по строковому значению index[0] и удалить дубликаты при сохранении результата в новом объекте.

Полученные значения будут выглядеть так:

[ {name: 'Deer Skin', quantity: 4}, {name: 'Bear Skin', quantity: 5}, {name: 'Cougar Skin', quantity: 4} ... ]

Я не совсем уверен, как действовать дальше. Прямо сейчас у меня есть массив объектов со всеми начальными удаленными значениями дубликата массива:


[
{name: "Deer Skin", quantity: 0}
{name: "Bear Skin", quantity: 0}
{name: "Cougar Skin", quantity: 0}
...

Но я не понимаю, как я могу отобразить значения:

[ ['Deer Skin', 1], ['Bear Skin', 1], ['Deer Skin', 1], ['Cougar Skin', 2] ... ]

к вышеуказанному объекту.

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Вы можете использовать .reduce для достижения этой цели. Здесь я инициализировал аккумулятор (acc) как пустой объект {}. Поскольку массив повторяется, троичный оператор решает, добавлять ли количество к текущему значению ключа (elem[0]) (мы добавляем, только если мы видели это раньше - если мы пытались добавить к чему-то, чего у нас не было Если бы мы видели ранее, мы получим NaN в качестве нашего значения) или создадим ли новую пару ключ-значение (если мы не видели значение ключа раньше).

См. Рабочий пример ниже:

const arr = [
  ['Deer Skin', 1],
  ['Bear Skin', 1],
  ['Deer Skin', 1],
  ['Cougar Skin', 2]
];

const res = arr.reduce((acc, elem) => {
  elem[0] in acc ? acc[elem[0]] += elem[1] : acc[elem[0]] = elem[1];
  return acc;
}, {});

console.log(res);
0 голосов
/ 13 января 2019

Использование Object.entries, array.reduce и деструктуризация массива:

const data = [
  ['Deer Skin', 1],
  ['Bear Skin', 1],
  ['Deer Skin', 1],
  ['Cougar Skin', 2]
];

const reduceData = (data) => data.reduce((acc, [key, count]) => {
  if (!acc[key]) acc[key] = 0; // If key doesn't exist yet, add and set count to zero
  acc[key] += count;
  return acc;
}, {});

console.log(reduceData(data));

// But if you want an array, use Object.entries
console.log(Object.entries(reduceData(data)));
0 голосов
/ 13 января 2019

Поскольку вы не упомянули структуру нового объекта, в котором вы собираетесь хранить уникальные объекты, вы можете сделать что-то вроде этого:

const arrayItems = [ ['Deer Skin', 1], ['Bear Skin', 1], ['Deer Skin', 2], ['Cougar Skin', 2] ... ];
const deduplicatedObj = {};

for(let item of arrayItems){
    deduplicatedObj[item[0]] = item[1];
}

console.log(deduplicatedObj); // This should be an object with key as 'Deer Skin' and value as 1, and so on. 

Поскольку вы сохраняете значение в объекте, а объект может иметь только уникальные ключи, при назначении item[1] на deduplicatedObj[item[0]] он будет перезаписывать существующее значение, если оно есть.

deduplicatedObj будет выглядеть примерно так:

deduplicatedObj = {
    'Deer Skin': 2,
    'Bear Skin': 1,
    'Cougar Skin': 2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...