我想从对象数组中获取最接近的对象,如果没有匹配的元素,我想从数组中获取最接近的对象。下面是例子:例如,我们假设数组如下。
const array = [
{ element1: 50, element2: 100, element3: 200, element4: 90 },
{ element1: 150, element2: 110, element3: 200, element4: 190 },
{ element1: 250, element2: 120, element3: 190, element4: 290 },
{ element1: 350, element2: 130, element3: 120, element4: 390 },
{ element1: 450, element2: 140, element3: 140, element4: 490 },
{ element1: 550, element2: 150, element3: 160, element4: 590 },
]
我在设置中设置了如下的值。{ element1: 60, element2: 100, element3: 200, element4: 100 },
,
那么实际上,在数组中没有与这个元素相匹配的元素,这时,它就会返回其中最接近的一个元素。{ element1: 50, element2: 100, element3: 200, element4: 90 }
.
你可以利用 reduce
然后根据输出的值进行排序。
var array = [ { element1: 50, element2: 100, element3: 200, element4: 90 }, { element1: 150, element2: 110, element3: 200, element4: 190 }, { element1: 250, element2: 120, element3: 190, element4: 290 }, { element1: 350, element2: 130, element3: 120, element4: 390 }, { element1: 450, element2: 140, element3: 140, element4: 490 }, { element1: 550, element2: 150, element3: 160, element4: 590 }];
var settings = { element1: 60, element2: 100, element3: 200, element4: 100 };
var [difference, result] = Object.entries(array.reduce((acc, elem)=>{
difference = 0;
Object.keys(elem).forEach(k=>difference+=Math.abs(elem[k]-settings[k]));
acc[difference] = acc[difference] || [];
acc[difference].push(elem);
return acc;
},{})).sort((a,b)=>a[1]-b[1])[0];
console.log(result);
console.log(difference)
function objectDistance(obj1, obj2) {
return (
obj1.element1 +
obj1.element2 +
obj1.element3 +
obj1.element4 -
obj2.element1 -
obj2.element2 -
obj2.element3 -
obj2.element4
);
}
array.map(function (x) {
objectDistance(x, toCompare);
});
这个map函数会返回一个距离数组,你要做的就是计算最小值,然后访问你的对象数组,然后返回它。 注:不是js高手,但概念应该是对的。