Я пытаюсь (number: 5.6666, array: [-1, 9, 4, 10, 11, 0])
алгоритм в js
для сортировки от ближайшего к дальнему по заданному числу, например (number: 5.6666, array: [-1, 9, 4, 10, 11, 0])
должно возвращать [4, 9, 10, 0, 11, -1]
Любая идея, как подход к проблеме? Немного gotcha на самом деле мой массив массив массивов, и мне нужно сортировать по определенному ключу в объекте. В документах сказано, что следует использовать array.sort()
с функцией сравнения, но я не понимаю, как реализовать эту функцию.
Функция sort()
Array
может принимать функцию:
[1,2,3].sort((a, b) => /* do something */)
Каждый раз вы должны вернуть значение. Отрицательное число будет означать, что a
приходит до b
. Положительное число означает, что b
появляется перед a
. 0
означает, что они равны.
Если вам нужно расстояние до номера, вы хотите получить абсолютное значение с помощью Math.abs()
. Предполагая, что ключ на объекте является value
, вы можете собрать все это вместе:
const target = 5;
const values = [{ value: -100 }, { value: 1 }, { value: 4 }, { value: 6 }, { value: 10 }];
const result = values.sort(({ value: a }, { value: b }) =>
Math.abs(target - a) - Math.abs(target - b));
console.log(result);
Я использовал некоторую деструкцию ES6, чтобы сделать ее чище, вытащив value
из параметров.
Если вы хотите просто оставить оставшиеся значения (вместо объектов), вы можете использовать map()
после факта (или раньше).
Обратите внимание, что в случае, когда 2 числа находятся на равном расстоянии от цели (в моем примере 4
и 6
находятся на расстоянии 1
от цели), вы не можете гарантировать, что это произойдет первым. Если это имеет значение для вас, вам нужно добавить дополнительную логику для этого сценария.
Используйте array.sort
и получите разницу в каждом номере от array.sort
значения
var inputArray = [-1, 9, 4, 10, 11, 0],
input = 5;
var closest = inputArray.sort(function(a, b){
return Math.abs(input-a) - Math.abs(input-b);
});
console.log(closest);
num
ключа
Используя sort
, вы можете проверить каждое их расстояние от своего номера.
var num = 5.666
var arr = [-1, 9, 4, 10, 11, 0]
arr.sort(function(a, b){
return Math.abs(num-a) - Math.abs(num-b);
});
console.log(arr)