Я знаю, что вопрос старый, но это один из редких вопросов SO о цепочке в Lodash, остающемся без ответа, и попытка ответить на него позволяет мне глубже копать в документации и понимать эту библиотеку ... И это хорошая возможность попробовать функцию «Run JS code» для переполнения стека ...
Наконец-то я понял, что он не может работать так, как вы.
Во-первых, это rearg
действительно цельный? Ответ: да. Я пытался с этим кодом:
var last = _(twoParams).ary(1).rearg([1, 0]).value();
и в самом деле, когда я называю last
с двумя параметров, она вызывает twoParams
только с последним.
Конечно, rearg
может быть только закодирован с функциями, предоставляющими функцию как выход, и ожидая, что функция будет введена, т. Е. только в цепочке функций обработки функций.
Теперь ваш код не работает, потому что если rearg
является цепным, его выход не является! Его выход представляет собой простую старую функцию JavaScript, и они не связаны друг с другом. Хорошей новостью является то, что Lodash, в своей великой мудрости, обеспечивает способ сделать функцию цепочки. Вы должны использовать mixin
, который по умолчанию добавляет предоставленную функцию к Lodash и делает ее цельной. См., Например, Create chain in lodash with custom functions, в котором объясняется, как это сделать. В отличие от этих примеров, я буду следовать рекомендациям документации Lodash и использовать runInContext
, чтобы избежать загрязнения Lodash новой функцией, которая должна оставаться локальной.
Вот мои эксперименты. Я взял на себя смелость переименовать некоторые идентификаторы, как я ненавижу имена myXxx и предпочитают более описательные имена ...
// Generic code to display resuts
var results = document.getElementById('pls-results');
function showHTML(html)
{
results.insertAdjacentHTML('beforeend', html);
}
function show(text)
{
showHTML("<p>" + text + "<p>");
}
function showObject(obj)
{
show("<p>" + JSON.stringify(obj) + "<p>");
}
// The real code
var keyList = [ 'a', 'b', 'c', 'd' ];
var incompleteJson = { "a": 1, "b": 2 };
var fullJson = { "a": 1, "b": 2, "c": true, "d": "yes" };
// A simple way to do what is implied by the variable name
showHTML("<h3>Has All Keys</h3>");
show("Incomplete Json");
var diff = _.difference(keyList, _.keys(incompleteJson));
var hasAllKeys = diff.length === 0;
show(hasAllKeys);
show("Full Json");
diff = _.difference(keyList, _.keys(fullJson));
hasAllKeys = diff.length === 0;
show(hasAllKeys);
// What you try to do
showHTML("<h3>Consume Expected Keys</h3>");
var localLodash = _.runInContext();
localLodash.mixin(
{
'reverseDiff': _.rearg(_.difference, [1, 0]) // switching order of arguments
}
);
show("Incomplete Json");
var expectedKeys = localLodash.chain(incompleteJson)
.keys()
.reverseDiff(keyList)
.value();
showObject(expectedKeys);
show("Full Json");
expectedKeys = localLodash.chain(fullJson)
.keys()
.reverseDiff(keyList)
.value();
showObject(expectedKeys);
<div id="pls-results"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>
MyFunc (MyList) возвращает []. Это то, чего вы ожидаете? –
Будет ли другое решение цепочки, не использующее rearg, быть хорошим для вас? –