Как можно отфильтровать массив состоящий из объектов по двум свойствам

Помогите пожалуйста, отфильтровать массив состоящий из объектов. Задумка такая что кастомная функция 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))

→ Ссылка