2014-02-08 2 views
2

Я пытаюсь преобразоватьПочему lodash's mapValues ​​не работает с _.первым как обратный вызов?

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: [] } 

ответ

2

_.mapValues проходит больше, чем просто один аргумент обратного вызова функции. Таким образом, ваш первый пример (эквивалентный) на второй должен быть:

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

Как вы можете видеть here аргументов, передаваемых функции обратного вызова являются KeyValue, KEYNAME, объект вещи.

+0

А, так и подпись '_.first (array, [callback], [thisArg])' имеет некоторые параметры, заполненные совершенно неправильными значениями, поэтому делает неправильную вещь. Есть ли что-нибудь «причудливое» (короткое, сжатое, из коробки). Я могу обернуть '_.first', чтобы игнорировать что-либо, кроме первого аргумента, например мой обратный вызов с' arr': _ _mapValue (stuff, _ .fancy (_. первый)) '? – TWiStErRob

+0

@TWiStErRob: Конечно: '_.fancy = function (c) {return function() {return c (arguments [0]); }}; ';) –

+0

Это не из коробки ... Мне нужно написать это. – TWiStErRob

 Смежные вопросы

  • Нет связанных вопросов^_^