【问题标题】:JavaScript : Rearrange array elements according to the absolute difference with xJavaScript : 根据与 x 的绝对差值重新排列数组元素
【发布时间】:2019-11-03 21:16:53
【问题描述】:

根据与x i 的绝对差值重新排列数组元素。即,具有最小差异的元素首先出现,依此类推。就像我正在服用 数组 [10, 5, 3, 9, 2, 3]x = 7 那么每个元素的绝对差应该是 =

7 - 10 = 3(abs)
7 - 5 = 2
7 - 3 = 4
7 - 9 = 2(abs)
7 - 2 = 5
7 - 3 = 4

所以根据与X的不同,元素排列成[5,9,10,3,3,2]

我已经通过下面的代码尝试过,但仍然没有这样做:

function ar(a, x) {
  var obj = {}, d, i, res;

  for (i = 0; i < a.length; i++) {
    d = Math.abs(a[i] - x);
    obj[a[i]] = d;
  }
  
  res = Object.keys(obj).sort(function(a, b) {
    return obj[a] - obj[b]
  });
  
  for (i = 0; i < res.length; i++) {
    res[i] = parseInt(res[i]);
  }
  
  return res;
}

var o = ar([10, 5, 3, 9, 2, 3], 7);
console.log(o);

如您所见,我正在制作只有一个键但值在此处重复的对象.. 我找不到另一种解决方法,我得到的答案是 [5,9,10,3, 2]:(..

【问题讨论】:

  • 对象不能有重复的属性,所以当你重复一个属性时它会覆盖前一个

标签: javascript arrays sorting object absolute


【解决方案1】:

如您所见,我正在制作只有一个键但值的对象 在此重复

对象不能有重复的属性,所以当你重复一个属性时,它会用新值覆盖前一个属性

您可以简单地使用 Math.abs 进行排序

let arr = [10, 5, 3, 9, 2, 3]
let x = 7

let sortByDiff = (arr,x) => arr.sort((a,b)=> Math.abs(a-x) - Math.abs(b-x))

console.log(sortByDiff(arr,x))

【讨论】:

  • 你能解释一下它是如何工作的吗?虽然你的答案是正确的,但我没有得到它..
  • @Anonymus 在这里我们将绝对差异传递给排序的 compareFunction,而不是基于值排序,您可以阅读 Sort MDN 以了解排序的工作原理
【解决方案2】:

只要定义你的距离函数:

const dist = x => Math.abs(x - 7);

并将它的差异传递给sort 方法的两个参数。

arr.sort((a, b) => dist(a) - dist(b));

有关sort 方法的更多信息,请参阅MDN

const arr = [10, 5, 3, 9, 2, 3];
const dist = x => Math.abs(x - 7);
const sorted = arr.sort((a, b) => dist(a) - dist(b));

console.log(sorted);

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 2012-01-24
    • 2021-04-26
    • 2012-09-17
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多