我有一个像这样的数组:
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"}
我正在尝试通过 ClusterId
和 SlotID
删除重复项。下面是我的示例代码,其中我将重复值插入一个数组 (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 行。我需要第三行位于非重复数组中。
请帮助我实现这一目标
最佳答案
一旦解决方案是构造一个中间map
,其中:
map
的键是输入数组中每个项目的ClusterId
和SlotID
值的复合键,- 该值是该键的输入数组中遇到的最后一项
以这种方式构建 map
后,您将拥有一组由ClusterId
和SlotID
项目值唯一的值。然后可以将生成的 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:如何从数组中删除多个键的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56747796/