我有两个数组originalArray
和modifiedArray
,它们包含具有某些属性的对象; sys_id
是唯一的属性:
originalArray = [
{ sys_id: 1234, type: 'XYZZ' },
{ sys_id: 1235, type: 'ABCD' },
{ sys_id: 1236, type: 'IJKL' },
{ sys_id: 1237, type: 'WXYZ' },
{ sys_id: 1238, type: 'LMNO' }
]
modifiedArray = [
{ sys_id: 1234, type: 'XYZZ' },
{ sys_id: 1235, type: 'ZZAA' },
{ sys_id: 1236, type: 'ZZZZ' },
{ sys_id: 1252, type: 'AAAA' }
]
我希望组合/合并数组,但包含一个新属性,该属性描述了使用 sys_id 属性基于原始数组在新数组中发生的更改的完整说明。
resultingArray = [
{ sys_id: 1234, type: 'XYZZ', action: 'same' },
{ sys_id: 1235, type: 'ZZAA', action: 'edit' },
{ sys_id: 1236, type: 'ZZZZ', action: 'edit' },
{ sys_id: 1237, type: 'WXYZ', action: 'remove' },
{ sys_id: 1238, type: 'LMNO', action: 'remove' },
{ sys_id: 1252, type: 'AAAA', action: 'add' }
还想知道是否有更合适的术语,或者更简洁的方式来解释我在这里想要完成的任务?
我所在的平台仅限于 ES5。
最佳答案
使用Array#reduce()
创建使用sys_id
作为键并具有属性orig
和mod
的对象> 然后一个很好的旧 for in
循环来迭代该对象并比较两种类型(当它们存在时)或检查哪个不存在并将正确的数据推送到结果数组。
所有 ES5 兼容
var grouped = [originalArray, modifiedArray].reduce(function(acc, arr, i) {
var label = i === 0 ? 'orig' : 'mod';
for (var j = 0; j < arr.length; j++) {
var curr = arr[j], id = curr.sys_id;
acc[id] = acc[id] || {orig: null, mod: null };
acc[id][label] = curr;
}
return acc;
}, {});
var res = [];
function insertObj(o, act) {
var newObj = { action: act };
// iterate existing keys to add to new object
for (var k in o) {
if (o.hasOwnProperty(k)) {
newObj[k] = o[k]
}
}
res.push(newObj)
}
for (var key in grouped) {
var action, obj;
if (grouped.hasOwnProperty(key)) {
obj = grouped[key]
if (!obj.orig) {
insertObj(obj.mod, 'add');
} else if (!obj.mod) {
insertObj(obj.orig, 'remove')
} else {
action = obj.mod.type === obj.orig.type ? 'same' : 'edit';
insertObj(obj.mod, action)
}
}
}
console.log(res)
<script>
var originalArray = [
{ sys_id: 1234, type: 'XYZZ' },
{ sys_id: 1235, type: 'ABCD' },
{ sys_id: 1236, type: 'IJKL' },
{ sys_id: 1237, type: 'WXYZ' },
{ sys_id: 1238, type: 'LMNO' }
]
var modifiedArray = [
{ sys_id: 1234, type: 'XYZZ' },
{ sys_id: 1235, type: 'ZZAA' },
{ sys_id: 1236, type: 'ZZZZ' },
{ sys_id: 1252, type: 'AAAA' }
]
</script>
关于javascript - 包含对象的两个 js 数组的完全外连接 - 连接的数组包含新属性 'action'(添加/删除/编辑/相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55461184/