Удалите дубликаты из массива объектов в JavaScript Но объедините одно поле перед удалением дубликатов - PullRequest
1 голос
/ 28 апреля 2020

У меня есть следующая переменная:

var allProducts = [
    {"code": 1,"name": "productA", "category": ["fruits"],...},
    {"code": 1,"name": "productA", "category": ["vegetables"],...},
    {"code": 2,"name": "productB", "category": ["meat"],...},
    ...
]

Таким образом, единственная разница между двумя повторяющимися массивами объектов - это category; где в этом примере code: 1 один раз упоминается с category: ["fruits"], а другой раз с category: ["vegetables"]. Теперь я хочу удалить дубликат, но прежде чем сделать это; Я хотел бы сохранить все категории productA в одну category: ["fruits", "vegetables"], чтобы конечная переменная выглядела так:

var allProductsCleaned = [ 
    {"code": 1,"name": "productA", "category": ["fruits", "vegetables"],...},
    {"code": 2,"name": "productB", "category": ["meat"]...},
    ...
]

1 Ответ

2 голосов
/ 30 апреля 2020

Вот пример:

  • Создайте объект с помощью limit:
    • сохраните каждый объект в агрегированном объекте, чтобы проверить, не добавлен ли уже «код»
    • if уже присутствует, затем объединить массивы
  • преобразовать объект обратно в массив с Object.values()

const allProducts = [
    {"code": 1,"name": "productA", "category": ["fruits"]},
    {"code": 1,"name": "productA", "category": ["vegetables"]},
    {"code": 2,"name": "productB", "category": ["meat"]},
    {"code": 2,"name": "productB", "category": ["fish"]},
    {"code": 2,"name": "productB", "category": ["fish"]}
]

const output = Object.values(allProducts.reduce((aggObj, item) => {  
  if (aggObj[item.code]){
    //item already exists so merge the category arrays:
    const newArr = [...new Set([...aggObj[item.code].category, ...item.category])]
    aggObj[item.code].category = newArr;
  }else{
    //doesn't already exist:
    aggObj[item.code] = item;
  }  
  return aggObj
}, {}));

console.log(output);
...