Сохранить объект в массиве, который имеет самое высокое значение, но удалить все объекты, которые имеют повторяющиеся значения - PullRequest
2 голосов
/ 02 марта 2020

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

Например, в следующем массиве объектов я хочу удалить объект с дублирующейся ценой и оставить объект с наибольшим значением. -

const data = [{
    "title": "The Little Prince",
    "price": 49,
    "value": 20
  },
  {
    "title": "Watchmen",
    "price": 49,
    "value": "40"
  }
]

/**
const desiredOutput = [
  {
     "title":"Watchmen",
     "price": 49,
     "value": 40
  }
] 
**/

Вот мой код, но он не удаляет объект с одинаковой ценой и выдает тот же массив -

const data = [{
    "title": "The Little Prince",
    "price": 49,
    "value": 20
  },
  {
    "title": "Watchmen",
    "price": 49,
    "value": "40"
  }
]

const removeDuplicatePrice = plans => {
  const prices = [];
  const updatedBooks = plans.filter(el => {
    const matchingRack = prices.find(
      element =>
      element.price === el.price
    );
    let {
      price,
      value
    } = el;

    if (!matchingRack) {
      prices.push({
        price,
        value
      });
      return true;
    }

    if (el.value > matchingRack.value) {
      matchingRack.value = el.value;
      return true;
    }
    return false;
  });

  return updatedBooks;
};

console.log(removeDuplicatePrice(data));

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

Используя .reduce(), вы можете индексировать с помощью свойства price. Число price в объекте будет содержать текущий объект наибольшего значения для данной цены. Если ваш текущий объект, для которого вы выполняете итерацию, имеет более высокое значение value, вы можете обновить индексированное значение для этой цены, чтобы оно содержало новый объект. Вы можете получить Object.values() вашего накопленного объекта, чтобы получить уникальные объекты.

См. Пример ниже:

const data = [{ "title": "The Little Prince", "price": 49, "value": 20 }, { "title": "Watchmen", "price": 49, "value": 40 } ];

const res = Object.values(data.reduce((acc, obj) => {
  const curr = acc[obj.price];
  acc[obj.price] = curr ? (curr.value < obj.value ? obj : curr) : obj;
  return acc;
}, {}));

console.log(res);

Или использование ES6 Карта может быть более подходящим вариантом для использования с .reduce():

const data = [{ "title": "The Little Prince", "price": 49, "value": 20 }, { "title": "Watchmen", "price": 49, "value": 40 } ];

const res = Array.from(data.reduce((m, obj) => {
  const curr = m.get(obj.price);
  return m.set(obj.price, curr ? (curr.value < obj.value ? obj : curr) : obj);
}, new Map).values());

console.log(res);
1 голос
/ 02 марта 2020

Вы можете использовать array.reduce , чтобы удалить дубликаты из текущего массива:

const data = [{
    "title": "The Little Prince",
    "price": 49,
    "value": "20"
  },
  {
    "title": "Watchmen",
    "price": 49,
    "value": "40"
  }
]

let result = data.reduce((state, current) => {
   let prevIndex = state.findIndex(x => x.price === current.price);
   if(prevIndex === -1){
       state.push(current);
   }
   else if(state[prevIndex].value < current.value){
       state[prevIndex] = current;
   }
   return state;
}, []);

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...