You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript求两个数值数组最接近数对:Reducer实现遇阻

用reduce实现两个数组的最接近数对解决方案

我来帮你搞定这个问题!用reduce找两个数组的最接近数对,最容易踩的坑就是初始值设置不对或者没覆盖所有数对的迭代逻辑。我之前也踩过类似的坑,下面给你一步步拆解正确的实现思路和代码:

核心思路

要找到最接近的数对,我们需要遍历两个数组的所有组合,计算每对数的绝对差值,然后跟踪差值最小的那一组。用reduce的话,可以通过嵌套reduce来实现:外层遍历第一个数组的每个元素,内层遍历第二个数组找到当前元素的最接近值,再和全局的最小差值数对比更新。

正确实现代码

function findClosestPair(arrA, arrB) {
  // 初始化累加器:保存当前最小差值和对应的数对,初始差值设为无穷大确保第一个数对能被选中
  const initialState = { minDiff: Infinity, pair: [] };

  return arrA.reduce((globalAcc, numA) => {
    // 内层reduce:找到arrB中与numA最接近的数对
    const closestToNumA = arrB.reduce((innerAcc, numB) => {
      const currentDiff = Math.abs(numA - numB);
      // 如果当前差值更小,更新内层累加器
      return currentDiff < innerAcc.minDiff 
        ? { minDiff: currentDiff, pair: [numA, numB] } 
        : innerAcc;
    }, initialState);

    // 对比内层结果和全局最小,更新全局累加器
    return closestToNumA.minDiff < globalAcc.minDiff 
      ? closestToNumA 
      : globalAcc;
  }, initialState).pair;
}

常见错误排查

如果你之前的代码没得到预期结果,大概率是这几个问题:

  • 初始值错误:比如直接把初始值设为[arrA[0], arrB[0]],但如果这组不是差值最小的,后续就无法正确更新;
  • 没计算绝对差:直接用numA - numB比较,负数差值会导致判断错误;
  • 未遍历所有数对:只遍历了单个数组,没有嵌套处理另一个数组的所有元素;
  • 累加器更新逻辑错误:每次迭代没有正确对比当前差值和全局最小差值,导致遗漏更优解。

测试示例

// 测试用例
const a = [1, 7, 13];
const b = [4, 9, 15];
console.log(findClosestPair(a, b)); // 输出 [7,9](差值为2,是所有组合中最小的)

内容的提问来源于stack exchange,提问作者Bishrul hafi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:01:34