Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将函数包装到另一个函数中_Javascript_Functional Programming_Lodash - Fatal编程技术网

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

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"

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

_.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()
。是。正是我需要的。非常感谢。