下面给出的功能是基于多个条件的JS排序功能。我在某些网站上发现了这个很酷的功能。如果有人可以向我解释此功能,那就太好了。
我无法理解它的最后一部分,在其中用给定一个&b变量的另一个括号来调用它本身。 sortbyMultipleKeys(keys.slice(1))(a,b)
以这种方式调用函数;对我来说是全新的f()(a,b)<-Howwwwwwwwwww ??? :|。
如果有人可以举例说明,我将不胜感激。 :)
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)
答案 0 :(得分:3)
关于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
范围内访问。但这要归功于闭包。它可能是此代码中最重要的部分。希望能有所帮助:)
答案 1 :(得分:0)
这是一个功能:
hi = (s) => "hi from " + s
这让我们定义:
() => hi('a')
当我们这样做时会发生什么?
(() => hi('a'))()
或者这个:
(() => hi)()('a')
它们都输出相同的东西吗?功能只是一回事。 JavaScript使您可以返回内容。方法调用运算符()
调用函数。它使您可以检索其中的内容。