首页 > 解决方案 > 如何从对象数组中获取关闭对象?

问题描述

我正在尝试从对象数组中获取最近的对象。如果没有匹配的元素,我想从数组中获取最接近的元素?以下是示例:例如,假设数组如下:

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 }

标签: javascriptarraysobjectlodash

解决方案


您可以使用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)


推荐阅读