将函数包装到另一个函数中

Wrap the function into another function

我有使用 lodash 按对象 属性 对对象数组进行排序的代码。很简单:

_.sortBy(data.cycles, "id");

但是,我发现data.cycles[].id可能是一个字符串,所以我必须将每个属性转换为数字,然后再传递给_.sortBy。有什么优雅的方法吗?我想我应该以某种方式结合 _.propertyparseInt,但我不知道如何。

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()

我们基本上是同时进行映射和排序。除了作为单行代码之外,这还有一个效率优势:它不必对整个集合进行两次迭代。这对于较小的集合不是什么大问题,但对于较大的集合,影响是显而易见的。