Как отсортировать числа в массиве по ближайшим к числу?

274
04 февраля 2018, 02:51

Есть массив:

[["1.243","red"],["1.242","green"],["1.2425","orange"],
["1.3","grey"],["1.35","grey"],["1.244","grey"]]  

и число например 1.31

Нужно его отсортировать так, чтоб первые элементы были ближайшие к 1.31 и дальше по убывание близости.

Answer 1
let arr = [["1.243","red"],["1.242","green"],["1.2425","orange"],
["1.3","grey"],["1.35","grey"],["1.244","grey"]];

Сортировка:

arr.sort(function(a,b){
    return Math.abs(Math.abs(a[0])-1.31) - Math.abs(Math.abs(b[0])-1.31);
});

Когда-то поднимался вопрос,нужно ли в функции sort возвращать 0 или 1,отвечал тут

Answer 2

var data = [ 
  ["1.243", "red"], 
  ["1.242", "green"], 
  ["1.2425", "orange"], 
  ["1.3", "grey"], 
  ["1.35", "grey"], 
  ["1.244", "grey"] 
]; 
 
function sortClosestTo(arr, num, numSelector) { 
  arr.sort((l, r) => 
    Math.abs(num - numSelector(l) - Math.abs(numSelector(r) - num)); 
} 
 
sortClosestTo(data, 1.31, (el) => +el[0]); 
 
console.log(data);

Для отрицательных числах это так же рассчитывается верно:

var data = [ 
  ["1.243", "red"], 
  ["-1.242", "green"], 
  ["-1.27", "greens"], 
  ["1.2425", "orange"], 
  ["1.3", "grey"], 
  ["-1.35", "grey"], 
  ["1.244", "grey"] 
]; 
 
function sortClosestTo(arr, num, numSelector) { 
  arr.sort((l, r) => 
    Math.abs(numSelector(l) - num) - Math.abs(numSelector(r) - num)); 
} 
 
sortClosestTo(data, -1.31, (el) => +el[0]); 
 
console.log(data);

READ ALSO
В чем ошибка? Почему неожиданный, когда ожидаемый?

В чем ошибка? Почему неожиданный, когда ожидаемый?

Почему unexpected token '(' во второй функции?

177
Как взять картинку с абзаца внутри цикла абзацов и картинок

Как взять картинку с абзаца внутри цикла абзацов и картинок

Есть массив абзацов и картинок текущей страницыВсе картинки внутри абзацов

228
Пробелы в textarea при считывании с БД

Пробелы в textarea при считывании с БД

При считывании информации с БД в textarea выводит отступы в начало строки

236