在数组中找到最接近给定值的对象

7

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

const data = [
  { age: 52 },
  { age: 53 },
  { age: 54 },
  { age: 60, some: 'data' },
  { age: 66, something: 'else' },
  { age: 72 },
  { age: 78 },
  { age: 84 }
]

我使用data.find((d)=> d.age === 60)获取对象。但是如果年龄为61,则无法获得结果。在这种情况下,我想获取相同的对象。

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

正如您所看到的,年龄值不是线性的。


数组是否总是有序的? - nick zoum
@nickzoum 是的,但每个年龄值之间的差异并不总是相同的。 - user3142695
当输入63时,最接近的值应该是66还是60? - sumit
12个回答

0
假设您的列表未排序,且您不想对其进行排序。因此,您可以选择第一个对象,遍历列表并检查是否有更适合您要求的项目比当前选择的项目更好。如果是这样,您只需用更好的项目替换您的项目。

例如:

var data = [/*...*/];
var find_age = 64;           // input
var best_item = data[0];     // pick any item as best item
for (var i = 1; i < data.length; i++) {

  // does date[i] match the requirement better than best_item?
  if (Math.abs (best_item.age - find_age) > Math.abs (data[i].age - find_age)) {

    // it does ... so update best_item
    best_item = data[i];
  }
}

// best_item stores the item which matches your requirement most.

如果你的数据集已经排序,你可以优化运行时间。

0
假设数组未排序。以下函数返回结果。如果找到与搜索值相等的值,它会停止搜索,因此在性能上有一点小的提升。
function minDiff(data, val) {
    let res = null;
    let n = data.length;
    let diffGet = (val1, val2) => Math.abs(val1 - val2);

    if (n>0) {
        res = data[0];
        let diff = diffGet(res.age, val);
        let i = 1;
        while ( diff>0 && i<n ) {
            if (diffGet(data[i].age, val) < diff) {
                res = data[i];
                diff = diffGet(res.age, val);                
            }
            i++;            
        }        
    }

    return res;     
}

 

  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接