Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JavaScript ES6 Arrow函数作为参数传递_Javascript_Arrow Functions - Fatal编程技术网

如何将JavaScript ES6 Arrow函数作为参数传递

如何将JavaScript ES6 Arrow函数作为参数传递,javascript,arrow-functions,Javascript,Arrow Functions,我正在尝试.sort()一个对象数组,但我的javascript知识不足以重写comparator函数以接受箭头函数来查找对象上的键,而不是使用字符串。如果您能帮助重构,我们将不胜感激: 我的比较功能: compareValues=(key,order=“升序”)=>{ 设结果=0; 返回功能(左、右){ if(!(左侧hasOwnProperty(键)和右侧hasOwnProperty(键))){ 返回结果;//缺少属性;无法进行比较 } 常量l=lhs[key].toLowerCase()|

我正在尝试
.sort()
一个对象数组,但我的javascript知识不足以重写comparator函数以接受箭头函数来查找对象上的
键,而不是使用字符串。如果您能帮助重构,我们将不胜感激:

我的比较功能:

compareValues=(key,order=“升序”)=>{
设结果=0;
返回功能(左、右){
if(!(左侧hasOwnProperty(键)和右侧hasOwnProperty(键))){
返回结果;//缺少属性;无法进行比较
}
常量l=lhs[key].toLowerCase()| | lhs[key];
常量r=rhs[key].toLowerCase()| | rhs[key];
结果=(l>r)?1:(l
以常规方式使用:

objects.sort(compareValue(“name”);//或
排序(compareValues(“name”,降序));
目标是能够如此灵活地使用它:

objects.sort(compareValue(o=>o.name));
。。。但坦率地说,我直到最近才经常使用JS,所以我很烂。

可能类似于:

const compareValues = (pickProp, order = 'ascending') => {
    let result = 0

    return (lhs, rhs) => {
        const l = pickProp(lhs) // pickProp is passed #first-class
        const r = pickProp(rhs)
        if (!l && !r) {
            return 0 // Quick callout here, comparators only ever return -1, 0, or 1.
        }

        result = l > r ? 1 : l < r ? -1 : 0

        // Leveraging your default values here for cleaner signature
        return result * (order === 'ascending') ? 1 : -1
    }
}

list.sort(compareValues(o => o.name))
// or even 
list.sort(compareValues(o => o.name), 'descending')
constcomparevalues=(pickProp,顺序='升序')=>{
设结果=0
返回(左、右)=>{
const l=pickProp(lhs)//pickProp被传递#一级
常数r=pickProp(rhs)
如果(!l&&!r){
返回0//此处快速调用,比较器仅返回-1、0或1。
}
结果=l>r?1:lo.name))
//甚至
排序(compareValue(o=>o.name),“降序”)

我相信这与你的问题是一致的。

我认为你越接近你想要的是:

让compareValues=(key,order=“升序”)=>{
设结果=0;
返回功能(左、右){
如果(!(左键和右键){
返回结果;//属性无效;无法进行比较
}
常量l=键(lhs).toLowerCase()| |键(lhs);
常量r=键(rhs).toLowerCase()| |键(rhs);
结果=(l>r)?1:(lo.name));

console.log(对象)我认为您不需要对对象执行检查以查看它们是否具有特定属性,因为您可以肯定地知道。这就是我的看法


const comparer=(选择,下降=假)=>(a,b)=>{
设lhs=选择(a);设rhs=选择(b);
如果(左侧<右侧)返回下降?1:-1;
如果(左侧>右侧)返回下降?-1:1;
返回0;
}
设arr=[{id:1,name:“Clara”},{id:2,name:“Abraham”},{id:3,name:“Brian”}]
arr.sort(比较器(o=>o.name))
控制台日志(arr);
arr.sort(比较器(o=>o.name,true))

控制台日志(arr)
javascript没有带lambda表达式树的c#。您是说希望能够将
比较器
函数传递到
比较值
?根据函数的签名,它需要一个
,它看起来像一个
字符串
,但您试图传递一个
函数
。请在
比较值
中选中
。如果它是一个函数,请运行它,并将其用作查找的键。如果它不是一个函数,请将其用作键。@DanielA.White,但这不是必需的。这就是一流函数的威力:它们是一流的,不需要用面向对象的方式来处理。解释一下它是如何工作的就好了。我的意思不是评论每一行,只是让大家注意到选择器函数的核心思想是肯定的。更新一秒后,如果您需要其他信息,请告诉我。您的代码不起作用。
对象的顺序与它们进入的顺序相同。@ScottBaker对我来说,代码段的控制台显示:John,Mary。我看到Mary,John@ScottBaker经过Chrome测试,它显示了玛丽、约翰。在FF中没有。