Заменить значения массива объектов из другого массива объектов в JavaScript - PullRequest
3 голосов
/ 22 января 2020

Итак, у меня есть этот основной массив:

 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
  },

И я бы хотел заменить localized_title на массив, содержащий обновленный localized_title для определенных product_ids

пример:

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

В этом случае только первому дочернему элементу purchaseData необходимо обновить свой localized_title. Есть ли элегантный способ сделать это без использования For ... lopps и без изменения данных? Я пробовал много способов, но я, кажется, пишу слишком много строк кода (не очень чистый).

Это то, что я пытался:

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

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Я бы использовал карту для упрощения поиска объектов (это также делает код 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;
 });
1 голос
/ 22 января 2020

Будет стоить оптимизировать поиск, используя Map, чтобы уменьшить поиск foundObject с O (n) до O (1), и вместо двух return заявления, вы можете объединить их в одно:

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;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...