javascript - Lodash 在链中使用 rearg

标签 javascript lodash

我尝试过在有或没有链接的情况下使用 rearg ,但只有在使用链接时才会出现错误。我已经阅读了文档,看起来 rearg 应该可以很好地使用链接,因为它返回一个可链接的包装器方法。但是,我收到以下错误:

Error: _.chain(...).keys(...).myFunc is not a function

使用此代码:

var myList = ['a','b','c','d']
var myJSON = {
  'a':1,
  'b':2
};

var myFunc = _.rearg(_.difference, [1, 0]); //switching order of arguments

var hasAllKeys = _.chain(myJSON)
                  .keys()
                  .myFunc(myList)
                  .value();

当然,这段代码工作正常(尽管输出不是我需要的):

var wrong = _.chain(myJSON)
             .keys()
             .difference(myList)
             .values();

最佳答案

我知道这个问题已经很老了,但这是关于 Lodash 中的链接的罕见问题之一尚未得到解答,尝试回答它可以让我更深入地挖掘文档并理解这个库...... 而且这是尝试 Stack Overflow 的“运行 JS 代码”功能的好机会...

我终于明白它不能像你那样工作。

首先,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>

关于javascript - Lodash 在链中使用 rearg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32017764/

相关文章:

javascript - 在 lodash 中合并两个对象

javascript - 使用递归函数 trim 字段无法按预期工作

javascript - 在 Lodash 中根据条件合并两个 JSON 数组

javascript - 如何在 JavaScript 中编写 C# Z 轴矢量旋转?

java - 如何从 label 或 span 获取数据并将其传输到 div、其他 span 或标签

javascript - 从 Excel 复制并粘贴到 Angular 2 的网格中

javascript - 使用 Ramdajs 将命令式样式范式转换为函数式样式范式

javascript - 混合错误 : This request has been blocked; the content must be served over HTTPS

javascript - jQuery 按名称获取窗口

javascript - Lodash .clone 和 .cloneDeep 行为