Javascript “的计数”;定义为;数组元素

Javascript “的计数”;定义为;数组元素,javascript,undefined,Javascript,Undefined,给定以下数组: var arr = [undefined, undefined, 2, 5, undefined, undefined]; 我想获得已定义元素的计数(即:未定义的元素)。除了在数组中循环外,还有什么好方法吗?不,知道有多少元素没有定义的唯一方法是循环并计数它们。但是,这并不意味着你必须编写循环,只意味着必须在某个地方编写循环。(请参见下文第3节,了解我添加该警告的原因。) 如何循环并计算它们取决于您。有很多方法: 从0到arr.length-1(含)的循环的标准 循环中..的

给定以下数组:

var arr = [undefined, undefined, 2, 5, undefined, undefined];

我想获得已定义元素的计数(即:未定义的元素)。除了在数组中循环外,还有什么好方法吗?

不,知道有多少元素没有定义的唯一方法是循环并计数它们。但是,这并不意味着你必须编写循环,只意味着必须在某个地方编写循环。(请参见下文第3节,了解我添加该警告的原因。)

如何循环并计算它们取决于您。有很多方法:

  • 0
    arr.length-1
    (含)的
    循环的标准
  • 循环中..的
  • ECMAScript5中的几个新数组功能中的任意一个(前提是您使用支持它们的JavaScript引擎,或者您包含了一个ES5填充程序,因为它们都可以填充),比如,或者,传递适当的函数。这很方便,不仅因为您不必显式地编写循环,还因为使用这些特性使JavaScript引擎有机会以各种方式优化内部循环。(它是否真的存在取决于发动机。)

  • …但这一切都相当于循环,无论是显式循环还是隐式循环(对于新的数组功能)。

    不幸的是,不是。你必须通过一个循环并计算它们

    编辑:


    在所有浏览器中循环和计数:

    var cnt = 0;
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] !== undefined) {
            ++cnt;
        }
    }
    
    var cnt = 0;
    arr.foreach(function(val) {
        if (val !== undefined) { ++cnt; }
    })
    

    数组
    length
    不是数组中的元素数,而是最高的
    索引+1
    <代码>长度
    只有在连续索引中存在有效元素时,属性才会报告正确的元素计数

    var a = [];
    a[23] = 'foo';
    a.length;  // 24
    

    也就是说,如果不使用任何形式的循环,就无法从计数中排除未定义的元素。

    在最近的浏览器中,您可以使用

    另一种方法(如果浏览器支持阵列):

    var size = arr.slice(0).sort().indexOf(undefined);
    
    如果数组中只有一位数的元素,则可以使用该肮脏技巧:

    console.log(arr.join("").length);
    

    有几种方法可以使用,但最后我们必须看看是否值得使用这些方法而不是循环。

    如果未定义的是隐式的,那么您可以:

    var len = 0;
    for (var i in arr) { len++ };
    
    如果不显式设置,则未定义的是隐式的

    //both are a[0] and a[3] are explicit undefined
    var arr = [undefined, 1, 2, undefined];
    
    arr[6] = 3;
    //now arr[4] and arr[5] are implicit undefined
    
    delete arr[1]
    //now arr[1] is implicit undefined
    
    arr[2] = undefined
    //now arr[2] is explicit undefined
    

    删除值,然后进行检查(如果需要,请在此处删除空检查)

    含氯

    const x = _.size(_.filter(A, item => !_.isNil(item)))
    

    =而言,code>不是一个很好的测试,它将错误地计算
    null
    @T.J.Crowder-切换到
    ==。我应该更清楚!或者,如果您想更实用一步:var count=arr.reduce(函数(计数器,值){return value==undefined?计数器:计数器+1;})@雅各布-你确定这样行吗?表示
    reduce
    跳过数组中的漏洞(我假设是未定义的元素)。有一个小问题:它不会区分值未定义的成员和未定义的成员之间的区别,例如
    a=新数组(5)的长度为5,并且没有任何成员。但是OP可能不在乎在不循环的情况下,可以过滤掉未定义的VAL并获得该数组的大小。检查我的answer@blackpla9ue,我只考虑不带JQuery库的核心JavaScript语言。这个问题只标记为javascript。@blackpla9ue:您的方法循环,它只在jQuery代码(最初)或
    过滤器中执行(您当前的更新——不起作用,顺便说一句)。过滤器是loop@T.J.Crowder我修正了答案。你现在能查一下吗?那是一个。。。有趣的方法。请注意,如果其中一个元素是
    0
    null
    (计数错误),则它将失败。它依赖于ES5,这是最好的选择。它仍然在循环,只是隐式地而不是显式地进行。@T.J.Crowder非常感谢您的解释。我编辑了我的回答你把
    Array.prototype.filter
    算作循环吗?@RobG:我算了,因为而且它必须是通用的。这并不意味着浏览器的引擎不能比JavaScript代码更快地循环(特别是,使用
    过滤器
    或类似工具可以让引擎在知道它真正处理的是数组而不是类似数组的对象时进行优化),但它仍然是一个循环。当然,就我们实际编写的内容而言,它不像
    for
    循环那样循环(我喜欢新东西的许多原因之一)。不过,你启发了我添加一个警告::-)不错的解决方案,但根据经验,最好采用尽可能通用的方法。几乎从不依赖浏览器的javascript引擎特性!曾经尽可能遵守标准javascript(ECMA),并注意最新标准,因为浏览器需要一段时间才能正确实现某些功能(如果有的话)。通过使用过滤器,你可以排除任何使用ie9的人(老天不允许)<谁是所有仍然使用WinXP的人。不幸的是,即使在2014年XP支持结束很久之后,它仍然是最流行的桌面操作系统(正如你所说,我们应该尽量遵守标准javascript(ECMAScript),我完全同意你的观点!而且
    filter
    是ECMA的一部分。它也不是那么新(ES5,不是6)。幸运的是,与其他标准相比,它是ES标准中易于多填充的标准之一。我在回复中的链接也提供了多填充。如果我们是为web开发的,我的建议是始终将多填充包含在ES5方法中;现在将自己屏蔽在ES3中是没有意义的。
    //both are a[0] and a[3] are explicit undefined
    var arr = [undefined, 1, 2, undefined];
    
    arr[6] = 3;
    //now arr[4] and arr[5] are implicit undefined
    
    delete arr[1]
    //now arr[1] is implicit undefined
    
    arr[2] = undefined
    //now arr[2] is explicit undefined
    
    const x = A.filter(item => item !== undefined || item !== null).length
    
    const x = _.size(_.filter(A, item => !_.isNil(item)))