如何找到最接近目标数组的数组?

3

我正在处理下面的代码。有没有办法获取与目标数组在所有项上匹配的最近数组?

var counts = [
              [4,9,15],
              [2,11,81],
              [20,12,80],
              [14,3,80],
              [15,6,2],
              ]
  goal = [14,10,70];

var closest = counts.reduce(function(prev, curr) {
  return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
});

console.log(closest);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


3
请添加目标和期望结果。 - Nina Scholz
嗯,不太确定该怎么说,但从视觉上看,“20,12,80”集合比其他选项更接近,那么我该如何通过代码来获取它呢? - Mona Coder
你必须写出你想要的结果。而且你不需要jQuery来实现这个。 - some
值的位置是否有意义?[20,12,80][80,20,12]被认为是相同的吗?还是要将目标中的第一个值与计数中的第一个值进行比较? - some
嗨Mona。我是一名志愿编辑,时不时地编辑和改进问题,以便未来的读者能够尽可能地阅读和简洁。我注意到你的问题中有相当多的废话材料,其中一些带有无助、恳求的语气。你能不能让它们更简洁一些?这个讨论可能是一个有用的资源——它关于乞求对志愿者帮助者的影响。 - halfer
在 Stack Overflow 上,我们强烈倡导使用句子标题(sentence case titles)。值得一提的是,标题大小写对于作家和排版师来说已经过时了,现如今只用于正式场合。我已经编辑了你的许多标题,如果你能换用句子标题,将会为我省下不少工作。 - halfer
2个回答

2
你可以将其看作是 n 维空间中的距离(在这种情况下为 3 维)。最初的回答。

var counts = [
              [4,9,15],
              [2,11,81],
              [20,12,80],
              [14,3,80],
              [15,6,2],
              ]
  goal = [14,10,70];

var best = Infinity;
var closest = null;
for(var i in counts) {
  var sum = 0;
  for(var j in counts[i]) {
    sum += (goal[j] - counts[i][j])**2;
  }
  if ((sum**.5) < best) {
    closest = counts[i];
    best = sum**.5;
  }
}

console.log(closest);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


1
你可以使用一个 delta 函数,该函数接受两个数组并返回绝对差的总和。

const delta = (a, b) => a.reduce((r, v, i) => r + Math.abs(v - b[i]), 0);

var counts = [[4, 9, 15], [2, 11, 81], [20, 12, 80], [14, 3, 80], [15, 6, 2]],
    goal = [14, 10, 70],
    closest = counts.reduce((a, b) => delta(a, goal) < delta(b, goal) ? a : b);

console.log(closest);

通过使用 delta 的平方。

const delta = (a, b) => a.reduce((r, v, i) => r + (v - b[i]) ** 2, 0);

var counts = [[4, 9, 15], [2, 11, 81], [20, 12, 80], [14, 3, 80], [15, 6, 2]],
    goal = [14, 10, 70],
    closest = counts.reduce((a, b) => delta(a, goal) < delta(b, goal) ? a : b);

console.log(closest);


1
不需要绝对值,如果你平方 :) - SirPilan

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