使用sortBy进行Lodash链接时会产生错误,而vanilla排序会起作用

时间:2017-03-14 19:34:07

标签: javascript functional-programming underscore.js lodash

鉴于此:

let nums = [1,5,4]
let sorter = (a,b) => a.property > b.property ? 1 : -1;
let mapper = x => {return {property:x}}

这会引发错误:

_.chain(nums).map(mapper).sortBy(sorter).value()
// Uncaught TypeError: Cannot read property 'property' of undefined

虽然这不是:

nums.map(mapper).sort(sorter)
// [{"property":1},{"property":4},{"property":5}]

是什么给出的?我们无法保证sortBy会在map之后运行吗?或者我错过了一些真正明显的东西?

2 个答案:

答案 0 :(得分:4)

Lodash的sortBy函数接受迭代的第二个参数,并且不接受与本地sort()函数相同的排序函数模式。您可以将其放在要排序的键的字符串中:

_.chain(nums).map(mapper).sortBy('property').value()

或者传入一个指向要排序的属性的函数:

_.chain(nums).map(mapper).sortBy((o) => o.property).value()

答案 1 :(得分:1)

lodash采用的分拣机功能只有一个参数: https://lodash.com/docs/4.17.4#sortBy

https://jsfiddle.net/jq26573q/

let sorter = (o) => o.property;

虽然更好的是直接指定属性:

let sorter = 'property';