簡體   English   中英

從 JavaScript 中的另一個對象數組替換一個對象數組的值

[英]Replace values of an array of objects from another array of objects in JavaScript

所以我有這個主數組:

 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 ,該數組包含某些 product_ids 的一些更新的 localized_title

例子:

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

我會使用 Map 來簡化檢索對象(這也使代碼 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;
 });

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM