【问题标题】:How to find the number that best matches a given number如何找到与给定数字最匹配的数字
【发布时间】:2021-02-05 22:25:13
【问题描述】:

如何为给定号码找到最合适的号码。

例如。我有一个数字 8 和一个对象数组。

let num = 8;
let data = [
  { fist:  {a: 1, b: 2}, second: {c: 11, d: 12}, number: 1 },
  { fist:  {a: 3, b: 4}, second: {c: 13, d: 14}, number: 7 },
  { fist:  {a: 5, b: 6}, second: {c: 15, d: 16}, number: 10 },
];

每个对象中所有数字中最接近的数字是 7。 如何显示数字 7 所属的整个讣告?

【问题讨论】:

  • 对比中是否只使用了number
  • 如果距离相等会怎样?例如4

标签: javascript arrays algorithm loops object


【解决方案1】:

您可以通过选择给定值和所需值的绝对增量较小的项目来减少数组。

let num = 8,
    data = [{ fist: { a: 1, b: 2 }, second: {c: 11, d: 12 }, number: 1 }, { fist: { a: 3, b: 4 }, second: { c: 13, d: 14 }, number: 7 }, { fist: { a: 5, b: 6 }, second: { c: 15, d: 16 }, number: 10 }],
    result = data.reduce((a, b) =>
        Math.abs(num - a.number) < Math.abs(num - b.number) ? a : b
    );

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

【讨论】:

  • 返回整个 obj,而不仅仅是最接近的数字。
【解决方案2】:

您可以使用.reduce 获取与num 距离最小的obj:

let num = 8;
let data = [
  { fist:  {a: 1, b: 2}, second: {c: 11, d: 12}, number: 1 },
  { fist:  {a: 3, b: 4}, second: {c: 13, d: 14}, number: 7 },
  { fist:  {a: 5, b: 6}, second: {c: 15, d: 16}, number: 10 },
];

const _isEmpty = (obj) => Object.keys(obj).length === 0;

const objWithClosestNumber = data.reduce((acc, item) => {
  if(_isEmpty(acc)) { return item };
  const closestDist = Math.abs(num - acc.number),
    currentDist = Math.abs(num - item.number);
  acc = (currentDist < closestDist) ? item : acc;
  return acc;
}, {});

console.log(objWithClosestNumber);

【讨论】:

    【解决方案3】:

    遍历数组,找到最小的差。

    let num = 8;
    let data = [
      { fist: { a: 1, b: 2 }, second: { c: 11, d: 12 }, number: 1 },
      { fist: { a: 3, b: 4 }, second: { c: 13, d: 14 }, number: 7 },
      { fist: { a: 5, b: 6 }, second: { c: 15, d: 16 }, number: 10 },
    ];
    
    let diff = Math.abs(num - data[0].number);
    let ret = data[0];
    data.forEach((x) => {
      if (diff > Math.abs(x.number - num)) {
        diff = Math.abs(x.number - num);
        ret = x;
      }
    });
    console.log(ret);

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 2021-05-12
      • 1970-01-01
      相关资源
      最近更新 更多