根据两个条件从 JavaScript 中的对象数组中删除对象(重复 mac 地址和使用条件小于或大于)



我想根据 RSSI 值从具有相同 mac 地址的数组中删除对象,无论一个值大于另一个值。

例如

values = [{
mac: 'AC233F271F7E',
rssi: '-60',
}, {
mac: 'AC233F271F80',
rssi: '-65',
}, {
mac: 'AC233F271F7E',
rssi: '-55',
}, {
mac: 'AC233F2AFB37',
rssi: '-70',
}]

如何根据重复的mac地址删除对象,不仅如此,还要删除RSSI值较小的对象。所以最终结果会是这样的,

values = [{
mac: 'AC233F271F80',
rssi: '-65',
}, {
mac: 'AC233F271F7E',
rssi: '-55',
}, {
mac: 'AC233F2AFB37',
rssi: '-70',
}]

我一直在寻找许多有关如何根据条件删除 StackOverflow 中重复对象的解决方案。但是,我找到的所有解决方案都根据相似性删除了对象,例如,像下面的代码一样,它根据重复的位置和名称删除了对象。但是我想要一些可以在其中一个 RSSI 值大于另一个时删除重复对象的东西。

things.thing = things.thing.filter((thing, index, self) =>
index === self.findIndex((t) => (
t.place === thing.place && t.name === thing.name
))
)

我也尝试了这段代码,但它只删除了基于 mac 地址的重复对象。

var i;
var obj = {};
var len=vm.allbeacons.length
for (  i=0; i < len; i++ ){
obj[vm.allbeacons[i]['mac']] = vm.allbeacons[i];
}
vm.allbeacons= new Array();
for ( var key in obj )
{   vm.allbeacons.push(obj[key]);
} 

我希望有一个代码可以删除具有相同 mac 地址并且还基于 RSSI 值的对象,无论一个值大于另一个值。如果您能帮助我,请提前非常感谢您,非常感谢!

归约成一个按 MAC 地址索引的对象,其值是迄今为止找到的最大值(您可以使用Math.max计算(。然后使用Object.entries将对象转换回数组:

const values = [{
mac: 'AC233F271F7E',
rssi: '-60',
}, {
mac: 'AC233F271F80',
rssi: '-65',
}, {
mac: 'AC233F271F7E',
rssi: '-55',
}, {
mac: 'AC233F2AFB37',
rssi: '-70',
}];
const obj = values.reduce((a, { mac, rssi }) => {
a[mac] = a[mac] ? Math.max(a[mac], rssi) : rssi;
return a;
}, {});
const output = Object.entries(obj).map(([mac, rssi]) => ({ mac, rssi: String(rssi) }));
console.log(output);

如果要将数组对象保持在一起(这会保留对象中的其他属性(,请将累加器对象的值更改为这些对象,而不仅仅是rssi号:

const values = [{
mac: 'AC233F271F7E',
rssi: '-60',
foo: 5
}, {
mac: 'AC233F271F80',
rssi: '-65',
foo: 6
}, {
mac: 'AC233F271F7E',
rssi: '-55',
foo: 7
}, {
mac: 'AC233F2AFB37',
rssi: '-70',
foo: 8
}];
const accumObj = values.reduce((a, obj) => {
if (!a[obj.mac] || Number(a[obj.mac].rssi) < Number(obj.rssi)) {
a[obj.mac] = obj;
}
return a;
}, {});
const output = Object.values(accumObj);
console.log(output);

如果与旧浏览器的向后兼容性是一个问题,那么简单的嵌套循环似乎是最好的解决方案。

大多数浏览器都支持其他答案中使用的功能,因此仅当您需要较旧的浏览器(如Internet Explorer等(时,才会这样做。

var values = [{
mac: 'AC233F271F7E',
rssi: '-60'
}, {
mac: 'AC233F271F80',
rssi: '-65'
}, {
mac: 'AC233F271F7E',
rssi: '-55'
}, {
mac: 'AC233F2AFB37',
rssi: '-70'
}];
//Log initial values
console.log("Initial values");
console.log(values);
function RemoveDuplicatesKeepLargerRSSI(list) {
for (var index1 = 0; index1 < list.length; index1++) {
var obj1 = list[index1];
for (var index2 = index1 + 1; index2 < list.length; index2++) {
var obj2 = list[index2];
//If same mac adress
if (obj1.mac === obj2.mac) {
//numeric compare rssi
if (parseInt(obj1.rssi, 10) < parseInt(obj2.rssi, 10)) {
//remove from outer loop and break inner cycle
list.splice(index1, 1);
break;
}
else {
//remove from inner loop and offset index
list.splice(index2, 1);
index2--;
}
}
}
}
return list;
}
//Log modified values
console.log("Modified values");
console.log(RemoveDuplicatesKeepLargerRSSI(values));

你可以拿一个哈希表来检查rssi

var values = [{ mac: 'AC233F271F7E', rssi: '-60' }, { mac: 'AC233F271F80', rssi: '-65' }, { mac: 'AC233F271F7E', rssi: '-55' }, { mac: 'AC233F2AFB37', rssi: '-70' }],
result = Object.values(values.reduce((r, o) => {
if (!r[o.mac] || +r[o.mac].rssi < +o.rssi) r[o.mac] = o;
return r;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新