javascript - 包含对象的两个 js 数组的完全外连接 - 连接的数组包含新属性 'action'(添加/删除/编辑/相同)

标签 javascript arrays full-outer-join

我有两个数组originalArraymodifiedArray,它们包含具有某些属性的对象; 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作为键并具有属性origmod的对象> 然后一个很好的旧 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/

相关文章:

javascript - 如何使这个 jQuery 驱动的页面更快速?

php - MySQLi PHP -> 使用获取数组时 LEFT JOIN 返回 Null

sql - 如何在 MySQL 中进行 FULL OUTER JOIN?

sql - 如何在 MySQL 中执行 FULL OUTER JOIN?

javascript - 如何正确使用Express 4多路路由器

JavaScript 对象原型(prototype)中毒

php - 从 MySQL 查询构建多维 PHP 数组

java - 尝试返回Java中两个对象的面积之和

mysql多表选择最近7天

javascript - 单击按钮将不同的图片加载到一个 <div>