js根据需求合并两个数组对象

var a = [{ id: 1, num: 1 }, { id: 2, num: 3 }, { id: 3, num: 4 }]
var b = [{ id: 2, num: 1 }, { id: 3, num: 1 }]

a为原数组,b为新数组,a、b数组的长度不固定
a数组的num值可以被操作,b数组的num值每次必定都是1
b数组每一次和a数组合并,要求:
1、如果b数组的某一项在a数组中不存在,就插入到a数组中
2、如果b数组的某一项在a数组中存在,保留a数组中的某一项,删除b数组的某一项
3、b数组中插入到a数组中的新数据和a数组中已存在的数据要重新排在数组前面
以上需求合并,结果应为

[{ id: 2, num: 3 }, { id: 3, num: 4 }, { id: 1, num: 1 }]
阅读 5.1k
3 个回答

我理解为这样

var a = [
      { id: 1, num: 1 },
      { id: 2, num: 3 },
      { id: 3, num: 4 },
      { id: 6, num: 5 }
    ];
    var b = [
      { id: 2, num: 1 },
      { id: 3, num: 1 }
    ];
    const c = b.map(item => {
      return a.find(r => r.id === item.id) || item;
    });
    console.log([...c, ...a.filter(r => !b.some(r1 => r1.id == r.id))]);
var a = [{ id: 1, num: 1 }, { id: 2, num: 3 }, { id: 3, num: 4 }];
var b = [{ id: 2, num: 1 }, { id: 3, num: 1 }];

// 先根据 b 数组的内容进行映射,如果 a 中有的取 aIt,没有的取 bIt
const result1 = b.map(bIt => a.find(aIt => aIt.id === bIt.id) ?? bIt);

// 从 a 数组中排除掉 b 数据中已有的内容,准备着放后面
const result2 = a.filter(it => !b.find(bIt => bIt.id === it.id));

// 连接两个结果 —— 直接用表达式替换掉 result1 和 result2 就可以一句话写完
const result = [...result1, ...result2];


console.log(result);
写完了发现就是 @林枫 的答案……哈哈哈哈!
但是写都写了,就贴出来吧
arr = newArr.concat(arr)
let idArr = arr.map(item => { return item.id })

for (let i = 0; i < idArr.length; i++) {
  if (idArr.lastIndexOf(idArr[i]) !== i) {
    let temp = arr[idArr.lastIndexOf(idArr[i])]
    arr[idArr.lastIndexOf(idArr[i])] = arr[idArr.indexOf(idArr[i])]
    arr[idArr.indexOf(idArr[i])] = temp
    arr.splice(idArr.lastIndexOf(idArr[i]), 1);
    idArr = arr.map(item => { return item.id })
    i--;
  }
}
console.log(arr)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题