将函数包装到另一个函数中
Wrap the function into another function
我有使用 lodash 按对象 属性 对对象数组进行排序的代码。很简单:
_.sortBy(data.cycles, "id");
但是,我发现data.cycles[].id
可能是一个字符串,所以我必须将每个属性转换为数字,然后再传递给_.sortBy
。有什么优雅的方法吗?我想我应该以某种方式结合 _.property
和 parseInt
,但我不知道如何。
data.cycles
可能看起来像这样:
[
{
"id": "20",
"name": "John"
},
{
"id": "15",
"name": "Sarah"
},
{
"id": "158",
"name": "Bill"
},
{
"id": "-6",
"name": "Jack"
},
{
"id": "59",
"name": "Bob"
}
]
您可能希望先运行 map
并修改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()
我会编写一个 sortBy() 回调如下:
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' }
// ]
flow() function is useful when you want to compose a callback function out of many functions, it just forwards the output to the next function in line. The property() 函数 returns 一个从参数中获取指定 属性 名称的函数。这是 id
,然后传递给 parseInt()
。
我们基本上是同时进行映射和排序。除了作为单行代码之外,这还有一个效率优势:它不必对整个集合进行两次迭代。这对于较小的集合不是什么大问题,但对于较大的集合,影响是显而易见的。
我有使用 lodash 按对象 属性 对对象数组进行排序的代码。很简单:
_.sortBy(data.cycles, "id");
但是,我发现data.cycles[].id
可能是一个字符串,所以我必须将每个属性转换为数字,然后再传递给_.sortBy
。有什么优雅的方法吗?我想我应该以某种方式结合 _.property
和 parseInt
,但我不知道如何。
data.cycles
可能看起来像这样:
[
{
"id": "20",
"name": "John"
},
{
"id": "15",
"name": "Sarah"
},
{
"id": "158",
"name": "Bill"
},
{
"id": "-6",
"name": "Jack"
},
{
"id": "59",
"name": "Bob"
}
]
您可能希望先运行 map
并修改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()
我会编写一个 sortBy() 回调如下:
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' }
// ]
flow() function is useful when you want to compose a callback function out of many functions, it just forwards the output to the next function in line. The property() 函数 returns 一个从参数中获取指定 属性 名称的函数。这是 id
,然后传递给 parseInt()
。
我们基本上是同时进行映射和排序。除了作为单行代码之外,这还有一个效率优势:它不必对整个集合进行两次迭代。这对于较小的集合不是什么大问题,但对于较大的集合,影响是显而易见的。