3 votes

Remplacer les valeurs d'un tableau d'objets par un autre tableau d'objets en JavaScript

Donc j'ai ce tableau principal :

 const purchaseData = [
  {
    product_id: "product_id_1",
    localized_title: "Product Title 1",
    ... other attributes
  },
  {
    product_id: "product_id_2",
    localized_title: "Product Title 2",
    ... other attributes
  },

Et j'aimerais remplacer le titre localisé par un tableau qui contient un titre localisé mis à jour pour certains product_ids.

exemple :

updatedData = [
  {
    product_id: "product_id_1",
    localized_title: "Updated Product Title 1",
    ...other random attributes // different from the attributes in the objects of purchaseData
  },
];

Dans ce cas, seul le premier enfant de la purchaseData doit voir son localized_title mis à jour. Existe-t-il une manière élégante de procéder sans utiliser For...lopps et sans modifier les données ? J'ai essayé de nombreuses façons, mais je semble écrire trop de lignes de code (pas très propre).

C'est ce que j'ai essayé :

const updatedData = purchaseData.map(obj => {
    const foundObject = originalProducts.find(
      o => o.product_id === obj.product_id,
    );
    const localized_title = foundObject && foundObject.localized_title
    if (localized_title) {
        return {...obj, localized_title}
    }
    return obj;
  });

3voto

Jonas Wilms Points 52419

J'utiliserais une Map pour simplifier la récupération des objets (cela rend également le code O(n)) :

  const productById = new Map(products.map(it => ([it.product_id, it])));

  const updated = purchases.map(purchase => {
    const product = productById.get(purchase.product_id);

    if (product && product.localized_title) {
      return { ...purchase, localized_title: product.localized_title, };
    }

    return purchase;
 });

2voto

Patrick Roberts Points 405

Cela vaudra la peine d'optimiser votre recherche en utilisant un Map pour réduire la recherche de foundObject de O(n) à O(1), et au lieu de disposer de deux return vous pourriez les combiner en une seule :

const originalProductsMap = new Map(
  originalProducts.map(o => [o.product_id, o])
);

const updatedData = purchaseData.map(oldData => {
  const newData = originalProductsMap.get(oldData.product_id);
  const localized_title = newData && newData.localized_title;

  return localized_title
    ? { ...oldData, localized_title }
    : oldData;
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X