【问题标题】:How to find an object with a certain property value in an array?如何在数组中找到具有特定属性值的对象?
【发布时间】:2018-05-07 13:39:57
【问题描述】:

我有一个对象数组:

var allButtons = [
    buttonA,
    buttonВ,
    buttonС,
    "->"
];

此对象可以具有“隐藏”属性,该属性可以为真或假。

我需要(以最佳方式)发现这些“按钮”是否隐藏 === false(换句话说,是否可见)。

现在我使用这种原始方法:

someOfButtonsIsVisible = false;

Ext.each(allButtons, function (item){
    if(item.hidden === false) {
        someOfButtonsIsVisible = true;
    }
});

但在这种情况下,我必须检查所有对象并检查它们的“隐藏”属性。

有没有更好的方法可以知道数组中的任何对象是否隐藏了 === false?

【问题讨论】:

    标签: javascript arrays oop web extjs


    【解决方案1】:

    这是一个经典的顺序搜索案例。 无论您使用什么,时间复杂度都会在 O(1)(最佳情况)到 O(n)(最坏情况)之间变化。

    现在,如果您可以对数组进行排序,以便将可见按钮添加到顶部,那么搜索逻辑的时间复杂度将始终为 O(1)

    注意:满足条件后就中断循环。

    【讨论】:

      【解决方案2】:

      使用Array.prototype.find()。

      find() 方法返回数组中满足提供的测试函数的第一个元素的值。

      Find 将遍历您的数组,并在找到所需的值后停止。然后,您可以测试返回值是否不同于 undefined。

      编辑:如果您的目标是确定至少一个(或一些)值是否为false,那么array.some() 更好。如果您的目标是检索与hidden === false 匹配的值,那么array.find() 会更好。

      【讨论】:

        【解决方案3】:

        使用array.prototype.some:

        var someOfButtonsIsVisible = allButtons.some(button => button.hidden === false);
        

        也可以用array.prototype.every:

        var someOfButtonsIsVisible = !allButtons.every(button => button.hidden === true);
        

        但在你的情况下,array.prototype.some 更有意义

        【讨论】:

          猜你喜欢
          • 2017-07-07
          • 1970-01-01
          • 1970-01-01
          • 2015-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多