如何通过完整迭代比较两个数组并删除重复对象

4

我有两个对象数组,比如说:

var deSelectedRows = [
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC01"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC02"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC03"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC04"}
];

var selectedRows = [
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC01"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC02"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC03"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC04"}
];

当我尝试使用以下逻辑比较和迭代两个数组时:

for  (var  i  of selectedRows) {
    for  (var  j  of deSelectedRows) {
      if  ( i.id  ===  j.id ) {
        selectedRows.splice(i,  1);
      }
    }
  }

由于选定的行正在被拼接,因此我无法完全迭代。 请帮忙解决这个问题。

3
永远不要在你正在改变的数组上进行迭代。 - Pac0
@Pac0 为什么不呢? - Ele
2
@Pac0,更正:绝对不能这样做!!! :-) - FDavidov
因为您正在更改数组的内容。 - FDavidov
为了处理这个问题,你需要调整你的索引或使用函数 filter - Ele
显示剩余3条评论
3个回答

13
你可以使用一个 Set 来处理给定的 id,并用该集合过滤选中的行selectedRows

var deSelectedRows = [{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC01"}, { PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC02"}, { PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC03"}, { PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC04"}],
    selectedRows = [{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC01"}, { PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC02"}, { PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC03"}, { PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC04"}],
    ids = new Set(deSelectedRows.map(({ id }) => id));

selectedRows = selectedRows.filter(({ id }) => !ids.has(id));

console.log(selectedRows);


谢谢。你救了我。 - Zeeshan Safdar

8
您可以使用过滤器来实现此功能。

var deSelectedRows = [
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC01"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC02"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC03"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC04"}
];

var selectedRows = [
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC01"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC02"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC03"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC04"},
{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC05"}
];

selectedRows= selectedRows.filter(function(cv){
    return !deSelectedRows.find(function(e){
        return e.id == cv.id;
    });
});

console.log(selectedRows);


3
这帮助我从比较两个复杂对象数组中删除重复项。非常感谢! - SoftDev30_15
非常感谢你。愿上帝保佑你。真是救命恩人! - undefined

1
为了避免变异问题,您需要从最后一个元素开始循环,因为主要问题是已访问的元素。

var deSelectedRows = [{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC01"},{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC02"},{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC03"},{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC04"}];
var selectedRows = [{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC01"},{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC02"},{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC03"},{ PoHeaderKey: 129, OrderNo: "WS1", LineNo: 1, id: "BRIC04"}];

var i = selectedRows.length; 
while (i--) {
  for (var j of deSelectedRows) {
    if (selectedRows[i] && selectedRows[i].id === j.id) {
      selectedRows.splice(i, 1);
    }
  }
}

console.log(selectedRows)


一个 while 循环更加智能,因为减少和检查是单个操作:var i = array.length; while (i--) { doSomething(); } - Nina Scholz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接