1
votes

Supprimer l'objet dupliqué de Array Deep Check

J'ai un tableau d'objets, comme:

[{
  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
    } 
  }
}]

Je veux que ce tableau soit unique sur la base de offerId . Si offerId est le même, alors je souhaite supprimer cet objet du tableau.


0 commentaires

4 Réponses :


2
votes

Vous pouvez simplement utiliser une carte, avec réduire, et récupérer les valeurs de la carte:

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 commentaires

2
votes

Vous pouvez utiliser une carte temporaire, identifiée par ce que vous voulez être unique. Son constructeur accepte les paires [clé, valeur]:

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);


0 commentaires

0
votes

Vous pouvez créer un objet qui aurait objectId comme clé, comme ceci:

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

et ensuite, lorsque vous essayez d'ajouter à ce tableau, vous vérifiez simplement si l'élément avec la clé spécifique existe déjà.


0 commentaires

0
votes

Il est possible d'utiliser la méthode réduire . Il vérifie s'il existe une propriété avec la même clé et si elle existe, il crée une clé, sinon il ne fait rien:

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));

Un exemple:

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


0 commentaires