javascript - JavaScript:比较两个对象
问题描述
我想比较两个对象来创建一个新对象。
original = [
{id: "A1", name: "Nick", age: 20, country: 'JP', code: 'PHP'}
]
edited = [
{name: "Mike", age: 30, country: 'US'},
{id: "A1", name: "Nick", age: 25, country: 'US', code: 'PHP'}
]
- 比较两个对象(“原始”和“编辑”)
- 如果设置了“id”,则比较相同的 ids 数据,并从“edited”中获取数据,并仅获取“id”和已编辑的数据。
- 如果未设置“id”,则保留整个数据
我想要的最终对象如下所示;
final = [
{name: "Mike", age: 30, country: 'US'},
{id: "A1", age: 25, country: 'US'}
]
我一直在尝试使用过滤器,但我无法得到想要的结果......
解决方案
尝试使用Array#reduce
.
更新所有密钥对匹配
Array#map
使用和indexOf
函数验证编辑后的数组 id 值在原始数组中是否可用- 如果不将整个对象推送到新数组
- 首先将原始数组重新创建为对象格式,例如
{key:[value]}
- 然后将每个键值对匹配或不与reduce函数内的forEach匹配
var original = [{id: "A1", name: "Nick", age: 20, country: 'JP'}];
var edited = [{name: "Mike", age: 30, country: 'US'},{id: "A1", name: "Nick", age: 25, country: 'US'}];
var ids_org = Object.keys(original[0]).reduce((a,b,c)=> (a[b]=original.map(a=> a[b]),a),{});
var res = edited.reduce((a, b) => {
if (b.id) {
Object.keys(b).forEach(i=>{
if(ids_org[i].indexOf(b[i]) > -1 && i != 'id')
delete b[i];
})
a.push(b);
} else {
a.push(b);
}
return a;
}, []);
console.log(res)
推荐阅读
- tcp - 关闭 OTP 主管拥有的 gen_tcp 侦听套接字
- python - Python 字节到字符串到字节
- windows-installer - 如何在命令行上将 MSM 文件转换为 MSI 文件?使用 Windows Installer SDK 或 COM 执行此操作
- xml - 如何在 XSLT/XPath 中解析“/”分隔的字符串?
- spring - Spring boot:从文件系统加载配置文件特定的 application.properties
- maven - 如何在 spring-boot 上从 IT 测试中纠正拆分 UT?
- html - 使用表单发布发布对象数组的正确方法
- python - Trio:从同一个 fd 读取多个任务
- ios - 无法获取 CIFilter: CIPerspectiveCorrection 在指定坐标处裁剪
- angular - 如果选择的详细信息值在角度 4 中为空,则隐藏输入字段