【问题标题】:Javascript: Check whether key exists in an array of objectsJavascript:检查对象数组中是否存在键
【发布时间】:2015-09-21 08:45:48
【问题描述】:
var _ = require('lodash');

var users = [
  { 'id': '1', 'coins': false },
  { 'id': '2', 'coins': false }
];

var a = _.every(users, function(p){
  if ('id' in p && 'coins' in p)
    return true;
  else
    return false;
});
console.log(a);

该函数用于检查对象数组中是否存在键。 如果其中一个对象不存在 "id" 或 "coins" ,则返回 false。

有没有更好的方法来编写代码的 sn-p? 我觉得很笨拙。

【问题讨论】:

    标签: javascript node.js lodash


    【解决方案1】:

    由于您在 node.js 中,您知道您已经拥有 array.every(),所以我看不出这里有任何理由使用 lodash 或 if/else。为什么不这样:

    var users = [
      { 'id': '1', 'coins': false },
      { 'id': '2', 'coins': false }
    ];
    
    var allValid = users.every(function(item) {
        return 'id' in item && 'coins' in item;
    });
    

    仅供参考,此代码假设没有人神秘地将名为 idcoins 的属性添加到 Object.prototype(这似乎是一个安全的假设)。如果你想防止这种情况发生,你可以使用item.hasOwnProperty('id') 而不是in

    【讨论】:

    • @RobG - 我会补充一点,但这些是文字,所以 .hasOwnProperty() 在这里似乎没有必要。
    • 非常感谢您的解释!
    【解决方案2】:

    至少,替换:

    if ('id' in p && 'coins' in p)
        return true;
    else
        return false;
    

    与:

    return 'id' in p && 'coins' in p;
    

    基本上,从不使用如下结构:

    if (x)
        return true;
    else
        return false;
    

    x 已经是一个布尔值,或者至少是一个 truthy / falsy 值。

    如果您需要确定返回值是布尔值,只需将其强制为 1:

    return !!('id' in p && 'coins' in p);
    

    另外,正如另一个答案中提到的,lodash 在这里是多余的。可以使用JS原生的[every][3].
    替换:

    _.every(users, function(p){
    

    与:

    users.every(function(p){
    

    【讨论】:

    • 好吧,x 不一定是布尔值...在这种特殊情况下是这样,但并非总是如此。
    • 这里不需要!!in 运算符已经返回一个布尔值。
    • @jfriend00:我只是添加了一个解释,即总是替换这样的 if 语句有时会导致意外响应。
    • in relational operator 返回真/假,这是关于 if (x) 测试的评论不正确。
    【解决方案3】:

    您可以使用_.has() 来检查对象属性是否存在:

    function checkValidity(array, listOfKeys) {
        return _.every(array, function (item) {
            return _.every(listOfKeys, function (key) {
                return _.has(item, key);
            });
        });
    }
    

    用法:

    checkValidity(users, ['id', 'coins']);
    

    【讨论】:

      【解决方案4】:

      我会使用 [Array.prototype.some()][1] 函数:

       var users = [
        { 'id': '1', 'coins': false },
        { 'id': '2', 'coins': false }
      ];
      
      
          var result = users.some(e => e.hasOwnProperty('id') && e.hasOwnProperty('coins'));
      
          console.log("The array contains an object with a 'name' and 'quantity' property: " + result);
      

      【讨论】:

        猜你喜欢
        • 2020-06-18
        • 2021-11-25
        • 2019-11-12
        • 2020-11-19
        • 1970-01-01
        相关资源
        最近更新 更多