在Jquery或Javascript中比较两个复杂数组

ibps3vxo  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(207)

我有两个复数数组,我想比较它们。

Array1 = [{INPUT_ID: 1, INPUT_VAL: "Test1", ACTIVE_FLAG: 1}, {INPUT_ID: 2, INPUT_VAL: "Test2", ACTIVE_FLAG: 1}, {INPUT_ID: 3, INPUT_VAL: "Test3", ACTIVE_FLAG: 1}, {INPUT_ID: 4, INPUT_VAL: "Test4", ACTIVE_FLAG: 1}]

Array2 = [{INPUT_ID: 1, INPUT_VAL: "Test1"}, {INPUT_ID: 2, INPUT_VAL: "Test2"}, {INPUT_ID:4, INPUT_VAL: "Test4"}, {INPUT_ID: 5, INPUT_VAL: "Test5"}]

我想比较它们,然后创建新的Array或修改Array1
在数组1中,我有INPUT_ID = 3,而在数组2中,我没有INPUT_ID = 3,所以我想为数组1中的INPUT_ID = 3标记ACTIVE_FLAG =“3”。在数组2中,我没有INPUT_ID = 5,但在数组1中,我有INPUT_ID = 5,所以我想将此对象添加到数组1中,并标记ACTIVE_FLAG =“2”。
我最后的阵法应该是这样的。

Array1 = [{INPUT_ID: 1, INPUT_VAL: "Test1", ACTIVE_FLAG: 1}, {INPUT_ID: 2, INPUT_VAL: "Test2", ACTIVE_FLAG: 1}, {INPUT_ID: 3, INPUT_VAL: "Test3", ACTIVE_FLAG: 3}, {INPUT_ID: 4, INPUT_VAL: "Test4", ACTIVE_FLAG: 1}, {INPUT_ID: 5, INPUT_VAL: "Test3", ACTIVE_FLAG: 2}]

如何使用Jquery实现这一点?

juud5qan

juud5qan1#

更容易阅读但效率低下(构建三个组、设置标记、concat和排序):

const inBoth = array1.filter(el1 => array2.some(el2 => el1.INPUT_ID === el2.INPUT_ID))
const minus = (a1, a2) => a1.filter(el1 => a2.every(el2 => el1.INPUT_ID !== el2.INPUT_ID))
const inFirst = minus(array1, array2)
const inSecond = minus(array2, array1)

inBoth.forEach(el => el.ACTIVE_FLAG = 1)
inFirst.forEach(el => el.ACTIVE_FLAG = 3)
inSecond.forEach(el => el.ACTIVE_FLAG = 5)

const res = [].concat(inBoth, inFirst, inSecond)
res.sort( (e1, e2) => e1.INPUT_ID - e2.INPUT_ID)

输入数组必须进行排序(同时遍历两个数组,并确定下一个元素是哪个),这是一种丑陋但有效的方法:

let ix1 = 0, ix2 = 0;
const res = []
while(ix1 < array1.length || ix2 < array2.length){
  const el1 = array1[ix1], el2 = array2[ix2]
  if(!el2 || (el1 && el1.INPUT_ID < el2.INPUT_ID)){
    // element is only in array1
    el1.ACTIVE_FLAG = 3
    res.push(el1)
    ix1++
    continue
  }
  const inBoth = el1 && el1.INPUT_ID === el2.INPUT_ID
  el2.ACTIVE_FLAG = inBoth ? 1 : 5
  res.push(el2)
  ix2++
  inBoth && ix1++
}

相关问题