javascript - 比较两个对象数组并修改原始对象数组
问题描述
让我们有两个对象数组,
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 };
}
});
但我无法从这里继续前进。如果有人需要任何进一步的解释或进一步的许可,请告诉我。
解决方案
您的代码的问题是
- 您必须从
oldArrayOfObject
in 中找到节点newArrayOfObject
。你oldInfo
应该被定义为oldInfo = newArrayOfObject.find((item) => item.Item === node.Item);
- 此外,如果
oldInfo
找到,您应该重新使用Price
asPrice: 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
. 然后更新hasPrice
,Price
如果找到匹配的节点。
工作小提琴
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);
推荐阅读
- javascript - 如何使用 React 渲染嵌套在另一个数组中的数组
- loopbackjs - loopback中的访问关系表
- c++ - 如何从未排序的链表中删除重复项
- unity3d - 在 Unity 中捕捉 UI 精灵?
- python - 通过替换计算两个数据帧中两列的减法
- networking - 无法从另一个 POD 连接到 K8s 服务
- ruby-on-rails - Active Record 和 PostGIS ST_BUFFER:LinearRing 环测试失败
- javascript - 打字稿:导入使用 module.exports 导出的内容
- r - 使用 switch 命令构造数字标志
- scala - 如何使用带有 pathPrefix 的 PathMatcher 将路径 url 重定向到 akka-http 10 中的 /index.html?