Javascript 将函数包装到另一个函数中
我有使用lodash按对象属性对对象数组进行排序的代码。这很简单:Javascript 将函数包装到另一个函数中,javascript,functional-programming,lodash,Javascript,Functional Programming,Lodash,我有使用lodash按对象属性对对象数组进行排序的代码。这很简单: _.sortBy(data.cycles, "id"); 但是,我发现data.cycles[].id可能是一个字符串,因此我必须先将每个属性转换为数字,然后再将其传递给\uu.sortBy。有什么优雅的方法吗?我想我应该以某种方式将\uu0.property和parseInt组合起来,但我不知道如何组合 data.cycles可能如下所示: [ { "id": "20", "name": "John"
_.sortBy(data.cycles, "id");
但是,我发现data.cycles[].id
可能是一个字符串,因此我必须先将每个属性转换为数字,然后再将其传递给\uu.sortBy
。有什么优雅的方法吗?我想我应该以某种方式将\uu0.property
和parseInt
组合起来,但我不知道如何组合
data.cycles
可能如下所示:
[
{
"id": "20",
"name": "John"
},
{
"id": "15",
"name": "Sarah"
},
{
"id": "158",
"name": "Bill"
},
{
"id": "-6",
"name": "Jack"
},
{
"id": "59",
"name": "Bob"
}
]
您可能希望先运行并修改id
,然后进行排序
在vanilla JS中,它看起来像:
function mapFn(item){
item.id = parseInt(item.id, 10);
return item;
}
var sortedCycles = data.cycles.map(mapFn).sort(sortFn);
在lodash中,您可以:
var sortedCycles = _.sortBy(_.map(data.cycles, mapFn), 'id');
// or
var sortedCycles = _.chain(data.cycles).map(mapFn).sortBy('id').value()
我将编写一个回调,如下所示:
var collection = [
{ id: '20', name: 'John' },
{ id: 15, name: 'Sarah' },
{ id: 158, name: 'Bill' },
{ id: '-6', name: 'Jack' },
{ id: 59, name: 'Bob' }
];
_.sortBy(collection, _.flow(_.property('id'), parseInt));
// →
// [
// { id: '-6', name: 'Jack' },
// { id: 15, name: 'Sarah' },
// { id: '20', name: 'John' },
// { id: 59, name: 'Bob' },
// { id: 158, name: 'Bill' }
// ]
当您想要从许多函数中组合回调函数时,该函数非常有用,它只是将输出转发到行中的下一个函数。该函数返回一个函数,该函数从其参数中获取指定的属性名。这是id
,它被传递到parseInt()
我们基本上是同时映射和排序的。除了一行程序之外,它还有一个效率优势:它不必在整个集合上迭代两次。这对于较小的集合不是什么大问题,但是对于较大的集合,其影响是显而易见的。是的,这样或那样:
\uuuu.sortBy(data.cycles,(cycle)=>parseInt(cycle.id))
但我希望有一个完整的lodash解决方案。@gxoptg lodash实际上有一个映射函数(这是文章中的一个链接)。您可以执行类似于的操作
或可能使用链
如.chain(data.cycles).map(mapFn).sort('id').value()
。是。正是我需要的。非常感谢。