【问题标题】:LoDash _.has for multiple keysLoDash _.has 用于多个键
【发布时间】:2015-05-14 03:16:34
【问题描述】:

是否有方法或方法链来检查 lodash 中可用的对象中是否存在键数组,而不是使用以下方法?

var params = {...}
var isCompleteForm = true;
var requiredKeys = ['firstname', 'lastname', 'email']

for (var i in requiredKeys) {
    if (_.has(params, requiredKeys[i]) == false) {
        isCompleteForm = false;
        break;
    }
}

if (isCompleteForm) {
    // do something fun
}

更新

感谢大家提供出色的解决方案!如果你有兴趣,这里是不同解决方案的 jsPerf。

http://jsperf.com/check-array-of-keys-for-object

【问题讨论】:

    标签: javascript arrays lodash


    【解决方案1】:

    我知道问题是关于 lodash,但这可以用 vanilla JS 来完成,而且速度要快得多:

    requiredKeys.every(function(k) { return k in params; })
    

    在 ES2015 中甚至更干净:

    requiredKeys.every(k => k in params)
    

    【讨论】:

    • 另请注意,虽然 OP 示例提到了简单(即直接)键,但 lodash _.has() 可以处理复杂的深度路径,例如person[2].firstName 显然不适用于上面的示例。
    【解决方案2】:

    您完全可以使用 everyhaspartialfunctions,就像这样

    var requiredKeys = ['firstname', 'lastname', 'email'],
        params = {
            "firstname": "thefourtheye",
            "lastname": "thefourtheye",
            "email": "NONE"
        };
    console.log(_.every(requiredKeys, _.partial(_.has, params)));
    // true
    

    我们将一个偏函数对象传递给_.every,实际上是_.has部分应用于params对象。 _.every 将迭代 requiredKeys 数组并将当前值传递给部分对象,这会将当前值应用到部分 _.has 函数并返回 truefalse。仅当数组中的所有元素在传递给函数对象时都返回 true 时,_.every 才会返回 true。在我上面显示的示例中,由于所有键都在params 中,因此它返回true。即使其中不存在单个元素,它也会返回false

    【讨论】:

    • 值得一提的是,如果要在整个应用程序中定期重用,这将是mixin 的理想候选者。它还将提高可读性。 fiddle
    【解决方案3】:

    假设 params 可以具有比所需更多的属性...

    var keys = _.keys(params);
    var isCompleteForm = requiredKeys.every(function (key) {
        return keys.indexOf(key) != -1;
    });
    

    应该做的伎俩。

    【讨论】:

      【解决方案4】:
      _(requiredKeys).difference(_(params).keys().value()).empty()
      

      我相信。关键步骤是将所有内容放入数组中,然后使用集合。

      _requiredKeys.map(_.pluck(params).bind(_)).compact().empty()
      

      可能会起作用。

      【讨论】:

      • TypeError: _.pluck(...).bind is not a function. 用于第二种解决方案
      • 我相信 _.pluck 现在在 lodash 4.15.0 中被称为 _.map
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      相关资源
      最近更新 更多