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

基于两个条件(重复mac地址和使用小于或大于的条件)从JavaScript中的对象数组中删除对象,javascript,arrays,object,duplicates,Javascript,Arrays,Object,Duplicates,我想根据RSSI值从具有相同mac地址的数组中删除对象,不管一个值是否大于另一个值 比如说, values = [{ mac: 'AC233F271F7E', rssi: '-60', }, { mac: 'AC233F271F80', rssi: '-65', }, { mac: 'AC233F271F7E', rssi: '-55', }, { mac: 'AC233F2AFB37', rssi: '-70',

我想根据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]);

    } 
vari;
var obj={};
var len=vm.allbeacons.length
对于(i=0;i

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

简化为一个由MAC地址索引的对象,其值是迄今为止发现的最大值(可以使用
Math.max
计算)。然后使用
对象将对象转换回数组。条目

const值=[{
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;
返回a;
}, {});
const output=Object.entries(obj.map)([mac,rssi])=>({mac,rssi:String(rssi)}));

控制台日志(输出)
您可以获取一个哈希表并检查
rssi

var value=[{mac:'AC233F271F7E',rssi:'-60'},{mac:'AC233F271F80',rssi:'-65'},{mac:'AC233F271F7E',rssi:'-55'},{mac:'AC233F2AFB37',rssi:'-70'}],
结果=对象.值(值.减少((r,o)=>{
如果(!r[o.mac]|+r[o.mac].rssi<+o.rssi)r[o.mac]=o;
返回r;
}, {}));
控制台日志(结果)

.as控制台包装{max height:100%!important;top:0;}
如果向后兼容旧浏览器是一个问题,那么简单的嵌套循环似乎是最好的解决方案

大多数浏览器都支持其他答案中使用的功能,因此只有当您需要Internet Explorer之类的旧浏览器时,才可以使用这些功能

var值=[{
mac:'AC233F271F7E',
rssi:“-60”
}, {
mac:'AC233F271F80',
rssi:“-65”
}, {
mac:'AC233F271F7E',
rssi:“-55”
}, {
mac:'AC233F2AFB37',
rssi:“-70”
}];
//记录初始值
控制台日志(“初始值”);
console.log(值);
已删除的函数副本扩容rssi(列表){
对于(var index1=0;index1log(移除的upleveduplicateskeeplargerrssi(值))
@CertainPerformance嗨,谢谢你的回复,在我的例子中,我只是比较第一个和第三个对象,因为它们有相同的Mac地址,所以我比较的是-55和-60。由于-55更大,第一个rssi值为-60的对象将被删除。您好,您的代码是最短的,在代码段中运行良好。但是,我不知道为什么它会在我的代码中返回RSSI值较小的对象,所以我只需将r[o.mac].RSSI>o.RSSI更改为r[o.mac].RSSIMath.max
)是的,它正在生成正确的输出。但是,很抱歉我犯了一个错误,我希望让问题更容易理解,所以我没有提到对象中还有其他值,例如UpdateTime,所以我意识到您的代码实际上会切掉这些值,只保留Mac和RSSI值。请参见编辑,将累加器的值设置为对象,而不仅仅是
rssi