Как можно отфильтровать массив состоящий из объектов по двум свойствам
Помогите пожалуйста, отфильтровать массив состоящий из объектов. Задумка такая что кастомная функция filter должна вернуть массив с объектами у которых свойство name будет оригинальное, а свойство price минимальное
Мой код:
const items = [
{name: 'Молоко', price: 90},
{name: 'Хлеб', price: 80},
{name: 'Кефир', price: 90},
{name: 'Молоко', price: 80},
{name: 'Хлеб', price: 70},
{name: 'Кефир', price: 80}
]
const filter = ( ) => items.forEach((element)=>{
let result = [{name: null, price: 100}]
for( resultItem of result){
if( element.name != resultItem.name && element.price < resultItem.price ){
result.push(element)
}
}
return result
})
console.log(filter(items))
Ответы (1 шт):
Автор решения: EzioMercer
→ Ссылка
Основная идея в том, что мы создаём дополнительный словарь и для каждого элемента смотрим:
- Там есть элемент с именем данного элемента? Если нет то просто добавлем элемент и идём дальше
- Там есть элемент с именем данного элемента и его цена больше чем цена того что на очереди? Если да то заменяем значение и идём дальше
- В любом другом случае просто идём дальше
Ну и собственно сам код:
const items = [
{name: 'Молоко', price: 90},
{name: 'Хлеб', price: 80},
{name: 'Кефир', price: 90},
{name: 'Молоко', price: 80},
{name: 'Хлеб', price: 70},
{name: 'Кефир', price: 80}
]
const filter = (array) => {
const arrayMap = array.reduce((map, item) => {
if (!map.has(item.name) || map.get(item.name) > item.price) {
map.set(item.name, item.price);
}
return map;
}, new Map());
return [...arrayMap].map(item => ({name: item[0], price: item[1]}));
}
console.log(filter(items))