Javascript Сортировка по нескольким клавишам (быстро) - PullRequest
0 голосов
/ 08 апреля 2020

Ниже заданной функции находится JS функция сортировки по нескольким критериям. Я нашел эту классную функцию на каком-то сайте. Было бы здорово, если бы кто-то мог объяснить мне эту функцию.

Я не могу понять последнюю часть этого, где он вызывает себя с другими скобками, учитывая переменные a & b внутри него. sortbyMultipleKeys (keys.slice (1)) (a, b)

вызов функции таким образом; совершенно новый для меня f () (a, b) <- Ho wwwwwwwwwww? ?? : |. </p>

Я был бы очень признателен, если бы кто-нибудь смог объяснить это на некоторых примерах. :)

var obj = [
  {alpha: 'c',year: 2002},
  {alpha: 'b',year: 2004},
  {alpha: 'a',year: 2004},
  {alpha: 'd',year: 2003},
  {alpha: 'a',year: 2002},
  {alpha: 'c',year: 2004},
  {alpha: 'd',year: 2001},
  {alpha: 'b',year: 2002},
  {alpha: 'a',year: 2003},
  {alpha: 'b',year: 2002},
  {alpha: 'd',year: 2001},
  {alpha: 'c',year: 2004}
];

function sortbyMultipleKeys(keys) {
  return function(a, b) {
    if (keys.length == 0) return;
    key = keys[0];
    if (a[key] > b[key]) return 1;
    else if (a[key] < b[key]) return -1;
    else return sortbyMultipleKeys(keys.slice(1))(a, b);
  }
}

let a = obj.sort(sortbyMultipleKeys(["alpha", "year"]));

console.log(a)

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Особенность Javascript в том, что вы можете вернуть функцию из функции.

function foo(){
  return function() { console.log('Hello!'); }
}

console.log(foo()); //prints function bar () { console.log('Hello') }

foo()(); //prints Hello!

Так что, по сути, sortbyMultipleKeys(keys.slice(1))(a, b) делает, вызывает функцию, которая была возвращена из функции sortbyMultipleKeys.

function sortbyMultipleKeys(keys) {
  return function(a, b) { //notice how this function is being returned
    if (keys.length == ...
  }
}

Если вы не понимаете, как работает sortbyMultipleKeys, я предлагаю прочитать о «замыканиях».

Например, когда вы делаете

console.log(sortbyMultipleKeys(["alpha", "year"]))

, вы увидите, что функция напечатана.

/* prints: ƒ (a, b) {
    if (keys.length == 0) return;
    key = keys[0];
    if (a[key] > b[key]) return 1;
    else if (a[key] < b[key]) return -1;
    else return sortbyMultipleKeys(keys.slice(1))(a, b);
  } */

Обратите внимание, что переменная keys существует в функции, даже если она доступна только в области действия sortbyMultipleKeys. Но это работает отлично благодаря замыканиям. И это, вероятно, самая важная часть этого кода. Надеюсь, что помогло:)

0 голосов
/ 08 апреля 2020

Это функция:

hi = (s) => "hi from " + s

, которая позволяет нам определить:

() => hi('a')

что происходит, когда мы делаем это?

(() => hi('a'))()

или это:

(() => hi)()('a')

Они все выводят одно и то же? Функция это просто вещь. JavaScript позволяет вам вернуть вещи. Оператор вызова метода () вызывает функции. Это позволяет вам получить то, что внутри них.

...