JavaScript: переставить элементы массива в соответствии с абсолютной разницей с x - PullRequest
3 голосов
/ 21 июня 2019

Переставьте элементы массива в соответствии с абсолютной разницей с 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] : (..

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

как вы видите, я делаю объект, который имеет только один ключ, но значения повторите здесь

Объекты не могут иметь повторяющиеся свойства, поэтому при повторении свойства оно заменяет предыдущее новым значением

Вы можете просто использовать сортировку с 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))
1 голос
/ 21 июня 2019

Просто определите свою функцию расстояния:

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

и передайте разницу ее, примененную к обоим аргументам метода sort.

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

См. MDN для получения дополнительной информации о методе sort.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...