#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
}, {}))