【问题标题】:Why lodash's mapValues fails with _.first as callback?为什么 lodash 的 mapValues 以 _.first 作为回调失败?
【发布时间】:2014-02-08 20:54:00
【问题描述】:

我正在尝试转换

var stuff = { 1234: [{ name: "obj1" }], 3456: [{ name: "obj2" }] };

{ 1234: { name: "obj1" }, 3456: { name: "obj2" } }

(注意奇异数组)。

我想通了:

_.mapValues(stuff, function(arr) { return _.first(arr); })

做的工作,但我不明白为什么以下还不够?

_.mapValues(stuff, _.first)

返回

{ 1234: [], 3456: [] }

【问题讨论】:

    标签: javascript arrays map javascript-objects lodash


    【解决方案1】:

    _.mapValues 将不止一个参数传递给回调函数。所以你的第一个例子(等同于)第二个应该是:

    _.mapValues(stuff, function() { return _.first.apply(this, arguments)})
    

    如您所见,here 传递给回调函数的参数是 keyValue、keyName、stuff 对象。

    【讨论】:

    • 啊,所以签名_.first(array, [callback], [thisArg]) 有一些参数填充了完全错误的值,因此做错了事情。有什么fancy(简短、简洁、开箱即用)我可以将_.first 包裹起来以忽略除第一个参数之外的任何内容,就像我使用arr 的回调一样:_.mapValue(stuff, _.fancy(_.first))
    • @TWiStErRob:当然:_.fancy = function(c) { return function() { return c(arguments[0]); } }; ;)
    • 这不是开箱即用的......我必须写它。
    • 如果你在 lo-dash/underscore 旁边使用 underscore-contrib 库,你可以使用 .unary : _.mapValue(stuff, _.unary(.first) ) - documentcloud.github.io/underscore-contrib/#unary
    • 请注意,从 lodash 3.0 开始,_.first() 仅返回数组的第一个元素,如果您要指定数组中的元素数,则必须使用 _.take()要返回的数组的开头。见lodash.com/docs#takelodash.com/docs#first
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    相关资源
    最近更新 更多