Объединение массивов для формирования списка элементов с дубликатами

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

В настоящее время у меня есть следующий код:

 
let ingrediantsResults = [
    {
        dinnerName: "Vegetable Soup",
        ingrediants: ["potatoes", "onion", "spring onion", "lentils", "beans", "turnip" ]
    },
    {
        dinnerName: "Spaghetti",
        ingrediants: ["spaghetti pasta", "tomato box", "onion", "sundried tomatoes", "tomato paste", "lentils"]
    }
];

var reducedArray = ingrediantsResults.reduce((acc,item) => {
    var previousItem = acc.find(findItem => findItem.dinnerName === item.dinnerName);
    if(!previousItem){
      acc.push({...item, quantity: 1})
    }else{
       previousItem.quantity  
    }
    return acc;
  },[]);
  
  console.log(reducedArray); 

  

в этом примере я изо всех сил пытаюсь найти способ создать новый массив с комбинацией всех ингредиентов. Также мне интересно, возможно ли, чтобы «ЕСЛИ» был дублированный элемент, в этом случае «onion» указан дважды, что он каким-то образом представлен?

Заранее благодарю вас за помощь!

Комментарии:

1. Вы можете использовать деструктурирование. Чтобы объединить два массива без дубликатов, вы можете сделать так: const array3 = […array1, …array2]

Ответ №1:

«Комбинация всех ингредиентов» (примечание по написанию) звучит как операция объединения ингредиентов каждого объекта, поэтому дубликаты удаляются. Вы могли бы сделать это с помощью Lodash (_.uniq), или вы могли бы сделать это с помощью a Set , преобразованного в массив:

 [...new Set([].concat(...ingrediantsResults.map(obj => obj.ingrediants)))]
  

Если вы хотите, чтобы дубликаты были представлены «каким-то образом», я так понимаю, вы имеете в виду не просто оставить их там, а посчитать их. В итоге вы получите словарь, в котором ключи являются ингредиентами, а значения — целыми числами. Опять же, у Lodash есть для этого (_.count или _.countBy). Или, чтобы избежать зависимости:

 let ingrediantsResults = [
  {
      dinnerName: "Vegetable Soup",
      ingrediants: ["potatoes", "onion", "spring onion", "lentils", "beans", "turnip" ]
  },
  {
      dinnerName: "Spaghetti",
      ingrediants: ["spaghetti pasta", "tomato box", "onion", "sundried tomatoes", "tomato paste", "lentils"]
  }]

const allIngredients = [].concat(...ingrediantsResults.map(obj => obj.ingrediants))

console.log(allIngredients.reduce((acc, item) => {
    acc[item] = (acc[item] || 0)   1
    return acc
}, {}))