【问题标题】:JavaScript: How to remove the duplicate entries from array with respect to multiple keysJavaScript:如何从数组中删除关于多个键的重复条目
【发布时间】:2019-06-25 06:09:24
【问题描述】:

我有一个这样的数组:

0: {ClusterId: "10.210.28.231", Device IP: "10.210.28.231", SlotID: "1"}
1: {ClusterId: "10.210.28.234", Device IP: "10.210.28.234", SlotID: "1"}
2: {ClusterId: "10.210.28.231", Device IP: "10.210.28.231", SlotID: "2"}
3: {ClusterId: "10.210.28.234", Device IP: "10.210.28.234", SlotID: "2"}
4: {ClusterId: "10.210.28.234", Device IP: "10.210.28.234", SlotID: "2"}
5: {ClusterId: "10.210.28.231", Device IP: "10.210.28.231", SlotID: "2"}

我正在尝试删除 ClusterIdSlotID 的重复项。下面是我的示例代码,其中我将重复值推送到一个数组 (duplicateArrayVal) 并且不重复到另一个数组 (importArrayVal)

UniqueArraybyObject($scope.excelRowArray, "SlotID", "ClusterId");

function UniqueArraybyObject(collection, slotId, clusterName) {
    var importArrayVal = [],
        slot = [],
        clusters = [];

    $scope.duplicateArrayVal = [];
    angular.forEach(collection, function(item) {
        var tempSlot = item[slotId];
        var cluster = item[clusterName];
        if ((slot.indexOf(tempSlot) === -1) || (clusters.indexOf(cluster) === -1)) {
            slot.push(tempSlot);
            clusters.push(cluster);
            importArrayVal.push(item);
        } else {
            $scope.duplicateArrayVal.push(item);
        }
    });

    return importArrayVal;
};

对我来说出现的问题是 3,4 和 5 行的项目没有显示,因为这些被认为是重复的。但只有第 4 行和第 5 行是重复的,而不是第 3 行。我需要第 3 行在非重复数组中。

请帮助我实现这一目标

【问题讨论】:

  • 为什么第三个不会被认为是重复的?你在想什么逻辑?它清楚地看到第三个是第一个的重复
  • 第一个使用 SlotID:1 而第三个使用 SlotID:2。我需要检查两个键
  • 那么就会全部申请,然后就不会把2当成重复了

标签: javascript jquery angularjs


【解决方案1】:

曾经的解决方案是构造一个中间map,其中:

  • map 的键是输入数组中每个项目的ClusterIdSlotID 值的复合键,并且
  • 该值是该键在输入数组中遇到的最后一项

以这种方式构建map 后,您将拥有一组由ClusterIdSlotID 项目值唯一的值。然后可以将生成的 map 传递给 Object.values() 以获取作为数组的唯一项值:

const data=[
{'ClusterId':"10.210.28.231",'Device IP':"10.210.28.231",'SlotID':"1",'Actions':"Assign"},
{'ClusterId':"10.210.28.234",'Device IP':"10.210.28.234",'SlotID':"1",'Actions':"Assign"},
{'ClusterId':"10.210.28.231",'Device IP':"10.210.28.231",'SlotID':"2",'Actions':"Assign"},
{'ClusterId':"10.210.28.234",'Device IP':"10.210.28.234",'SlotID':"2",'Actions':"Assign"},
{'ClusterId':"10.210.28.234",'Device IP':"10.210.28.234",'SlotID':"2",'Actions':"Assign"},
{'ClusterId':"10.210.28.231",'Device IP':"10.210.28.231",'SlotID':"2",'Actions':"Assign"}
];

/* Reduce input array to a map (see following description), and then
  extract map values as array to obtain final result */
const result = Object.values(data.reduce((map, item) => {

  /* Build a map of values where with a compound key derived from the
     ClusterId and SlodID field values */
  return { ...map,
    [`${ item.ClusterId }-${ item.SlotID }`]: item
  };

}, {}))

console.log(result);

更新

如果需要与旧版浏览器兼容,以下将实现相同的结果,而不依赖于较新的 ES6 语法:

var data=[
{'ClusterId':"10.210.28.231",'Device IP':"10.210.28.231",'SlotID':"1",'Actions':"Assign"},{'ClusterId':"10.210.28.234",'Device IP':"10.210.28.234",'SlotID':"1",'Actions':"Assign"},{'ClusterId':"10.210.28.231",'Device IP':"10.210.28.231",'SlotID':"2",'Actions':"Assign"},{'ClusterId':"10.210.28.234",'Device IP':"10.210.28.234",'SlotID':"2",'Actions':"Assign"},{'ClusterId':"10.210.28.234",'Device IP':"10.210.28.234",'SlotID':"2",'Actions':"Assign"},{'ClusterId':"10.210.28.231",'Device IP':"10.210.28.231",'SlotID':"2",'Actions':"Assign"}
];


var map = {};
for(var i = 0; i < data.length; i++) {
  var item = data[i];
  map[item.ClusterId + "-" + item.SlotID] = item;
}

var result = [];
for(var k in map) {
  result.push(map[k]);
}

console.log(result);

【讨论】:

  • 这可以用javascript或angular代替Es6来完成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
相关资源
最近更新 更多