如何从对象数组中获取最接近的对象?

问题描述 投票:0回答:2

我想从对象数组中获取最接近的对象,如果没有匹配的元素,我想从数组中获取最接近的对象。下面是例子:例如,我们假设数组如下。

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 }.

javascript arrays object lodash
2个回答
1
投票

你可以利用 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)

-1
投票
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高手,但概念应该是对的。

© www.soinside.com 2019 - 2024. All rights reserved.