Удалить дубликат объекта из Array Deep Check - PullRequest
1 голос
/ 19 февраля 2020

У меня есть массив объектов, например:

[{
  actionType: 10,
  orderItemId: "3205ae52-ab00-4823-a004-da0cda639065",
  productComponentAction:{
    productComponent:{
      offerId: 10002839,
      parentOfferId: 10003058,
      adoptableProdCompId: undefined
    } 
  }
},
{
  actionType: 10,
  orderItemId: "3205ae52-ab00-4823-2121-da0cda6390ae",
  productComponentAction:{
    productComponent:{
      offerId: 10002839,
      parentOfferId: 10003058,
      adoptableProdCompId: undefined
    } 
  }
}]

Я хочу, чтобы этот массив был уникальным на основе offerId. Если offerId то же самое, то я хочу удалить этот объект из массива.

Ответы [ 4 ]

2 голосов
/ 19 февраля 2020

Вы можете использовать временную Карту, обозначенную тем, что вы хотите, чтобы быть уникальным. Его конструктор принимает пары [ключ, значение]:

let data = [{actionType: 10, orderItemId: "3205ae52-ab00-4823-a004-da0cda639065", productComponentAction:{productComponent:{ offerId: 10002839, parentOfferId: 10003058,     adoptableProdCompId: undefined } }},{actionType: 10,orderItemId: "3205ae52-ab00-4823-2121-da0cda6390ae", productComponentAction:{ productComponent:{ offerId: 10002839,      parentOfferId: 10003058, adoptableProdCompId: undefined  }  }}];

let uniques = Array.from(new Map(
     data.map(item => [item.productComponentAction.productComponent.offerId, item])
).values());
    
console.log(uniques);
2 голосов
/ 19 февраля 2020

Вы можете просто использовать карту с помощью Reduce и получить значения с карты:

const arr = [{
    actionType: 10,
    orderItemId: "3205ae52-ab00-4823-a004-da0cda639065",
    productComponentAction: {
      productComponent: {
        offerId: 10002839,
        parentOfferId: 10003058,
        adoptableProdCompId: undefined
      }
    }
  },
  {
    actionType: 10,
    orderItemId: "3205ae52-ab00-4823-2121-da0cda6390ae",
    productComponentAction: {
      productComponent: {
        offerId: 10002839,
        parentOfferId: 10003058,
        adoptableProdCompId: undefined
      }
    }
  }
]

const filtered = Array.from(arr.reduce((a, v) => {
  const id = v.productComponentAction.productComponent.offerId
  if(!a.has(id)) a.set(id, v)
  return a
}, new Map()).values())

console.log(filtered)
0 голосов
/ 19 февраля 2020

Можно использовать reduce метод. Он проверяет, есть ли свойство с тем же ключом, и если он существует, он создает ключ, в противном случае он ничего не делает:

arr.reduce((a, c)=> {
    a[c.productComponentAction.productComponent.offerId] = 
        a[c.productComponentAction.productComponent.offerId] || {...c};
    return a;
}, {})

Пример:

let arr = [{
  actionType: 10,
  orderItemId: "3205ae52-ab00-4823-a004-da0cda639065",
  productComponentAction:{
    productComponent:{
      offerId: 10002839,
      parentOfferId: 10003058,
      adoptableProdCompId: undefined
    }
  }
},
{
  actionType: 10,
  orderItemId: "3205ae52-ab00-4823-2121-da0cda6390ae",
  productComponentAction:{
    productComponent:{
      offerId: 10002839,
      parentOfferId: 10003058,
      adoptableProdCompId: undefined
    }
  }
}];

let filteredList = arr.reduce((a, c)=> {
  a[c.productComponentAction.productComponent.offerId] = 
      a[c.productComponentAction.productComponent.offerId] || {...c};
  return a;
}, {})

console.log(Object.values(filteredList));
0 голосов
/ 19 февраля 2020

Вы можете создать объект, который будет иметь objectId в качестве ключа, например:

var target = {};
for (let item of myArray) {
    if (target[item.objectId] === undefined) {
        target[item.objectId] = item;
    }
}

, а затем, при попытке добавить к этому массиву, вы просто проверяете, является ли элемент с определенный ключ уже существует.

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