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

问题描述 投票:0回答:3

我有两个对象数组说,

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);
      }
    }
  }

由于所选行正在拼接,我无法完全迭代。请帮我解决一下这个。

javascript ecmascript-6 typescript2.0
3个回答
2
投票

您可以使用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);

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)

0
投票

您可以使用filter来实现此功能。

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);
© www.soinside.com 2019 - 2024. All rights reserved.