【问题标题】:Compare an array with keys to keys in an object JavaScript将带有键的数组与对象 JavaScript 中的键进行比较
【发布时间】:2016-01-24 18:51:34
【问题描述】:

我有一个带有 ["1", "5", "9"] 之类的键的数组 我有一个具有相同键的对象,如下所示:selections: { "5": {}, "12": {} }

从中获得boolean 值的最简单方法是什么。 如果我的对象中存在数组中的任何键,它应该返回true。 我正在使用 angular 和 lodash,是否有任何智能解决方案或者我需要为它做一个循环?如果我做一个循环,最有效的方法是什么?

【问题讨论】:

  • 你自己尝试了什么?
  • 我试过_.every(["1", "2", "5"], function (id) { if (!_.includes(_.pluck(selections, "id"), id)) { return true; } });
  • 见@Pavel Komiagin 的回答...

标签: javascript arrays angularjs object lodash


【解决方案1】:

您是否尝试使用 hasOwnProperty()?

function check() {
  var selections = { "5": {}, "12": {} };
  return ["1", "5", "9"].filter(function(value) {
    return selections.hasOwnProperty(value);
  }).length > 0;
}

【讨论】:

  • 漂亮整洁,喜欢! +1
  • 这个问题是它一直遍历整个数组。您可以在找到匹配项后立即停止。
  • 使用array.some而不是过滤器怎么样?那么就不需要长度检查了。
  • 完全同意,这个解决方案对大输入无效
  • @Etse 的每个问题是,如果数组中的所有值都通过谓词,它只返回 true - 而 op 希望它在任何值匹配谓词时返回 true - 所以 array.some 是在这种情况下更好的选择(如果谓词返回 true 而不是遍历整个数组,则立即返回)。
【解决方案2】:
var keys = ["1", "5", "9"]; 
var selections = {"5": {}, "12": {}};   

function hasAnyKey(keys, selections) {
  for (var i = 0; i < keys.length; i++) {
    if (selections[keys[i]]) {
      return true;
    }
  }
  return false;
};

hasAnyKey(keys, selections);

只要有 1 个匹配项,此解决方案就会返回,这相当于在至少有 1 个匹配项时返回 true,这是您想要的。理论上,对于更大的输入,这将比使用 Array.prototype.filter 的解决方案更快。

【讨论】:

    【解决方案3】:
    var selections = { "5": {}, "12": {} };
    var array = ["1", "5", "9"];
    
    array.some(key => selections.hasOwnProperty(key));
    

    【讨论】:

    【解决方案4】:

    只需一行代码:

    var array = ["1", "5", "9"],
        obj = { "5": {}, "12": {} },
        any = array.some(function (a) { return a in obj; });
    document.write(any);

    【讨论】:

    • 这是一个不错的解决方案,但它只有在我的所有键都与对象中的键匹配时才有效。但似乎您的解决方案也适用于任何键的array.some,所以就是这样:)
    【解决方案5】:

    Array.prototype.some() 对数组中存在的每个元素执行一次回调函数,直到找到一个回调函数返回真值。 如果找到这样的元素,some() 立即返回 true。 否则,some() 返回 false。 Array.prototype.some()ECMAScript 1.5 中,应该可以在任何地方使用。

    function compareArrayToObject(array, obj) {
        return array.some(function (a) { return a in obj; });
    }
    var array = ["1", "5", "9"];
    var obj = { "5": {}, "12": {} };
    var result = compareArrayToObject(array, obj);
    document.write(result);

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多