Javascript 检查两个数字数组中最接近的不同点

Javascript check the closest different from two array of numbers

我有两个数组 a 和 b,我想从这个数组中找到最接近的一对数字。但是我被困在减速器内,给定匹配 to.

预期输出为

[
  {
    "dif": 1,
    "val": 3,
    "to": 4
  },
  {
    "dif": 2,
    "val": 3,
    "to": 5
  },
  {
    "dif": 2,
    "val": 8,
    "to": 6
  }
]

const a = [1,2,3,8]
, b = [4,5,6]

const result = b.map(to => {
 return a
   .map(v => {return {val:v}})
   .reduce((prev, curr) => {
     return Math.abs(curr.val - to) < Math.abs(prev.val - to) ? {dif:Math.abs(prev.val - to), val:curr.val, to} : {dif: Math.abs(prev.val - to), val:prev.val, to}
    });
})

console.log(result)

您的代码中有一处更正。 {dif:Math.abs(prev - to), val:curr.val, to} 应该是 {dif:Math.abs(curr.val - to), val:curr.val, to}

const a = [1,2,3,8]
, b = [4,5,6]

const result = b.map(to => {
 return a
   .map(v => {return {val:v}})
   .reduce((prev, curr) => {
     return Math.abs(curr.val - to) < Math.abs(prev.val - to) ? {dif:Math.abs(curr.val - to), val:curr.val, to} : {dif: Math.abs(prev.val - to), val:prev.val, to}
    });
})

console.log(result)

您可以生成 cartesian product 并按差异排序。

var a = [1, 2, 3, 8],
    b = [4, 5, 6],
    result = a
        .reduce((r, c) => r.concat(b.map(d => ({ dif: Math.abs(c - d), val: c, to: d }))), [])
        .sort((a, b) => a.dif - b.dif);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

另一个选择:

const a = [1, 2, 3, 8],
    b = [4, 5, 6];
const result = b.map(v => {
    return a.reduce((re, value) => {
        let updateRule = re.val === undefined || (re.val !== undefined && Math.abs(value - re.to)) < re.dif;
        return updateRule ? { val: value, dif: Math.abs(value - re.to), to: v } : re;
    }, { to: v });
});

console.log(result);