如何将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中没有。