首页 > 解决方案 > 比较两个对象数组并修改原始对象数组

问题描述

让我们有两个对象数组,

let oldArrayOfObject = [
    {
      Item: "ACC",
      Price: "",
      hasPrice: false,
    },
    {
      Item: "BCC",
      Price: "",
      hasPrice: false,
    },
    {
      Item: "CCC",
      Price: "",
      hasPrice: false,
    },
    {
      Item: "DCC",
      Price: "",
      hasPrice: false,
    },
    {
      Item: "ECC",
      Price: "",
      hasPrice: false,
    },
  ];

let newArrayOfObject = [
  {
    Item: "ACC",
    Price: 12,
  },
  {
    Item: "BCC",
    Price: 50,
  },
  {
    Item: "ECC",
    Price: 21,
  }
];

比较两个对象数组,如果 newArrayOfObject 中存在特定项目的价格,则将价格插入该特定项目的 oldArrayOfObject 并设置 hasPrice: true。

预期的 O/P:

console.log(oldArrayOfObject)

[
    {
      Item: "ACC",
      Price: 12,
      hasPrice: true,
    },
    {
      Item: "BCC",
      Price: 50,
      hasPrice: true,
    },
    {
      Item: "CCC",
      Price: "",
      hasPrice: false,
    },
    {
      Item: "DCC",
      Price: "",
      hasPrice: false,
    },
    {
      Item: "ECC",
      Price: 21,
      hasPrice: true,
    },
  ];

为此,我尝试了,

const modifiedArrayOfObject = newArrayOfObject.map((node) => {
  const oldInfo = oldArrayOfObject.find((item) => item.Item === node.Item);
  if (oldInfo) {
    return { ...node, hasPrice: oldInfo.Price !==  node.Price }
  } else {
     return { ...node, hasPrice: true };
  }
});

但我无法从这里继续前进。如果有人需要任何进一步的解释或进一步的许可,请告诉我。

标签: javascriptarraysobject

解决方案


您的代码的问题是

  • 您必须从oldArrayOfObjectin 中找到节点newArrayOfObject。你oldInfo应该被定义为oldInfo = newArrayOfObject.find((item) => item.Item === node.Item);
  • 此外,如果oldInfo找到,您应该重新使用PriceasPrice: oldInfo.Price
  • 如果oldInfo找不到,则必须返回当前节点本身。不要hasPrice: true在那里手动设置。

工作小提琴

const oldArrayOfObject = [{ Item: "ACC", Price: "", hasPrice: false, }, { Item: "BCC", Price: "", hasPrice: false, }, { Item: "CCC", Price: "", hasPrice: false, }, { Item: "DCC", Price: "", hasPrice: false, }, { Item: "ECC", Price: "", hasPrice: false, }];

const newArrayOfObject = [{ Item: "ACC", Price: 12, }, { Item: "BCC", Price: 50, }, { Item: "ECC", Price: 21 }];

const modifiedArrayOfObject = oldArrayOfObject.map((node) => {
    const oldInfo = newArrayOfObject.find((item) => item.Item === node.Item);
    if (oldInfo) {
        return { ...node, Price: oldInfo.Price, hasPrice: oldInfo.Price !== node.Price }
    } else {
        return { ...node };
    }
});
console.log(modifiedArrayOfObject);

Array.map总是从现有数组创建一个新数组。

如果您想更新原始数组本身而不是创建新数组,您可以运行一个循环oldArrayOfObject并检查每个节点oldArrayOfObject是否存在于newArrayOfObject. 然后更新hasPricePrice如果找到匹配的节点。

工作小提琴

const oldArrayOfObject = [{ Item: "ACC", Price: "", hasPrice: false, }, { Item: "BCC", Price: "", hasPrice: false, }, { Item: "CCC", Price: "", hasPrice: false, }, { Item: "DCC", Price: "", hasPrice: false, }, { Item: "ECC", Price: "", hasPrice: false, }];

const newArrayOfObject = [{ Item: "ACC", Price: 12, }, { Item: "BCC", Price: 50, }, { Item: "ECC", Price: 21 }];

oldArrayOfObject.forEach((node) => {
    const oldInfo = newArrayOfObject.find((item) => item.Item === node.Item);
    if (oldInfo) {
        node.hasPrice = oldInfo.Price !== node.Price;
        node.Price = oldInfo.Price;
    }
});
console.log(oldArrayOfObject);


推荐阅读