给定的函数下方是基于多个条件的JS排序函数。我在某些网站上发现了这个很酷的功能。如果有人可以向我解释此功能,那就太好了。

我无法理解它的最后一部分,在其中用a和b变量给它加上另一个括号的情况下调用了它自己。 sortbyMultipleKeys(keys.slice(1))(a,b)

这样调用一个函数;对我来说是全新的f()(a,b)
如果有人可以举例说明,我将不胜感激。 :)



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)

最佳答案

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变量。但这要归功于闭包。它可能是此代码中最重要的部分。希望有帮助:)

关于javascript - Javascript按多个键排序(快速),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61092480/

10-11 13:20