如何将 JavaScript ES6 箭头函数作为参数传递
How can I Pass a JavaScript ES6 Arrow Function as a Parameter
我正在尝试 .sort()
对象数组,但我的 javascript 知识还不够强大,无法重写比较器函数来接受箭头函数来查找 key
在对象上而不是使用字符串。任何帮助重构这个将不胜感激:
我的比较函数:
compareValues = (key, order = "ascending") => {
let result = 0;
return function(lhs, rhs) {
if (!(lhs.hasOwnProperty(key) && rhs.hasOwnProperty(key))) {
return result; // property is missing; comparison is impossible
}
const l = lhs[key].toLowerCase() || lhs[key];
const r = rhs[key].toLowerCase() || rhs[key];
result = (l > r) ? 1 : (l < r) ? -1 : 0;
return result * (order === "ascending") ? 1 : -1;
};
};
常规使用方式:
objects.sort(compareValues("name")); // or
objects.sort(compareValues("name", descending));
目标是能够这样使用它:
objects.sort(compareValues(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')
我相信这符合你的问题。
我认为你越接近你想要的是这样的:
let compareValues = (key, order = "ascending") => {
let result = 0;
return function(lhs, rhs) {
if (!(key(lhs) && key(rhs))) {
return result; // property is invalid; comparison is impossible
}
const l = key(lhs).toLowerCase() || key(lhs);
const r = key(rhs).toLowerCase() || key(rhs);
result = (l > r) ? 1 : (l < r) ? -1 : 0;
return result * (order === "ascending") ? 1 : -1;
};
};
let objects = [{
"name": "Mary"
}, {
"name": "John"
}];
objects.sort(compareValues(o => o.name));
console.log(objects);
我认为您不需要对对象执行检查以查看它们是否具有特定属性,因为您肯定知道。所以这就是我的看法。
const comparer= (select, descend = false) => (a, b) => {
let lhs = select(a); let rhs = select(b);
if (lhs < rhs) return descend ? 1 : -1;
if (lhs > rhs) return descend ? -1 : 1;
return 0;
}
let arr = [{ id: 1, name: "Clara" }, { id: 2, name: "Abraham" }, { id: 3, name: "Brian" }]
arr.sort(comparer(o => o.name))
console.log(arr);
arr.sort(comparer(o => o.name, true))
console.log(arr);
我正在尝试 .sort()
对象数组,但我的 javascript 知识还不够强大,无法重写比较器函数来接受箭头函数来查找 key
在对象上而不是使用字符串。任何帮助重构这个将不胜感激:
我的比较函数:
compareValues = (key, order = "ascending") => {
let result = 0;
return function(lhs, rhs) {
if (!(lhs.hasOwnProperty(key) && rhs.hasOwnProperty(key))) {
return result; // property is missing; comparison is impossible
}
const l = lhs[key].toLowerCase() || lhs[key];
const r = rhs[key].toLowerCase() || rhs[key];
result = (l > r) ? 1 : (l < r) ? -1 : 0;
return result * (order === "ascending") ? 1 : -1;
};
};
常规使用方式:
objects.sort(compareValues("name")); // or
objects.sort(compareValues("name", descending));
目标是能够这样使用它:
objects.sort(compareValues(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')
我相信这符合你的问题。
我认为你越接近你想要的是这样的:
let compareValues = (key, order = "ascending") => {
let result = 0;
return function(lhs, rhs) {
if (!(key(lhs) && key(rhs))) {
return result; // property is invalid; comparison is impossible
}
const l = key(lhs).toLowerCase() || key(lhs);
const r = key(rhs).toLowerCase() || key(rhs);
result = (l > r) ? 1 : (l < r) ? -1 : 0;
return result * (order === "ascending") ? 1 : -1;
};
};
let objects = [{
"name": "Mary"
}, {
"name": "John"
}];
objects.sort(compareValues(o => o.name));
console.log(objects);
我认为您不需要对对象执行检查以查看它们是否具有特定属性,因为您肯定知道。所以这就是我的看法。
const comparer= (select, descend = false) => (a, b) => {
let lhs = select(a); let rhs = select(b);
if (lhs < rhs) return descend ? 1 : -1;
if (lhs > rhs) return descend ? -1 : 1;
return 0;
}
let arr = [{ id: 1, name: "Clara" }, { id: 2, name: "Abraham" }, { id: 3, name: "Brian" }]
arr.sort(comparer(o => o.name))
console.log(arr);
arr.sort(comparer(o => o.name, true))
console.log(arr);