在数组中查找具有最接近值的对象

use*_*695 3 javascript arrays object ecmascript-6

我需要通过最接近的值获取数组中的对象。让我通过一个例子来解释它:

const data = [
  { age: 52 },
  { age: 53 },
  { age: 54 },
  { age: 60, some: 'data' },
  { age: 66, something: 'else' },
  { age: 72 },
  { age: 78 },
  { age: 84 }
]
Run Code Online (Sandbox Code Playgroud)

我确实通过使用data.find((d)=> d.age === 60). 但是如果年龄是 ,我不会得到结果61。在这种情况下,我想获得相同的对象。

对于64下一个对象 ( { age: 66, something: 'else' }) 应该返回。

如您所见,年龄值不是线性的。

Nic*_*ons 5

您可以找到所有数字之间的差异,并且最接近零的那个将是您的结果,为了实现这一点,我使用.reduce()Math.abs()

const data = [ { age: 52 }, { age: 53 }, { age: 54 }, { age: 60 }, { age: 66 }, { age: 72 }, { age: 78 }, { age: 84 } ];

const getAge = (data, target) => 
  data.reduce((acc, obj) =>
     Math.abs(target - obj.age) < Math.abs(target - acc.age) ? obj : acc
  );
  
console.log(getAge(data, 61)); // {age: 60}
console.log(getAge(data, 50)); // {age: 52}
console.log(getAge(data, -1)); // {age: 52}
console.log(getAge(data, 90)); // {age: 84}
Run Code Online (Sandbox Code Playgroud)

这也适用于具有除age.