【问题标题】:Find length of an array in jquery getting wrong result在jquery中查找数组的长度得到错误的结果
【发布时间】:2015-04-29 11:43:14
【问题描述】:

我有如下的 javascript 代码来获取数组的大小,

var testvar = [  ];
testvar[1] = 2;
testvar[200] = 3;
alert(testvar.length);    //201

Fiddle demo

但是代码提醒201 insted 获取2 的大小,为什么?

我需要获取该数组中总元素的计数。

【问题讨论】:

标签: javascript arrays


【解决方案1】:

如果你想真正找到数组的长度,尽管做了这样的事情:

alert(Object.keys(testvar).length);

https://jsfiddle.net/4Lqsf45a/

请注意 Object.keys() 在 IE https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys 了解解决方法

【讨论】:

  • 这既没有给出数组的长度( testvar.length),也没有给出数组中元素的数量。 testvar.x = 1 不会更改数组中元素的数量,但会更改您的解决方案报告的值。
  • @zeroflagL 但是它确实回答了操作员的问题。请注意Enjoyted 是如何说“找到你的数组的长度”
  • Object.keys 与 IE 存在兼容性问题。 IE 支持从 IE9 开始。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

因为您正在使用testvar[200] = 3 在索引 200 处设置一个值。 length 属性将是数组的最后一个索引 + 1。

要获取元素的总数,您可以使用以下示例:

function countElements(arr) {
    var numElements = 0;
    for ( var indx in arr ) {
        numElements ++;
    }
    return numElements;
}

【讨论】:

  • 我需要获取该数组中总元素的计数。有可能吗?
  • @Shijin 上面的代码为你做的。它返回数组中的元素个数
  • 解决这个问题的方法真是太可怕了。尝试testvar[1000000000] = 5; 并在使用您的功能时观看您的浏览器冻结。 Object.keys(testvar).length; 是要走的路。
  • 如果数组是 : arr[1], arr[200], arr['a211'], isNaN 是没有意义和错误的,不是吗?
  • @devqon 删除了反对票。不过仍然看不到你的功能的意义。
【解决方案3】:

JavaScript 允许 sparse 数组,这意味着您可以拥有一个包含两个元素的数组,但数组的长度与最后一个元素的 index 挂钩,并且通过在最后一个索引上加 1 来实现。因此,如果您的最后一个索引是 200,则报告的数组长度将为 201。

更多详情请参阅this SO question

【讨论】:

    【解决方案4】:

    这应该得到正确数量的元素:

    testvar.filter(function(value) { return value !== undefined }).length;
    

    【讨论】:

      【解决方案5】:

      因为您不能以这种方式分配值。您刚才所做的是创建一个长度为 200(包括 0)的数组。

      你应该使用一个对象来代替你正在做的事情。

      我相信您尝试做的事情只适用于 PHP 数组

      【讨论】:

        【解决方案6】:

        length 属性没有说明数组中定义值的数量。

        要获取已定义项目的数量,您可以使用类似这样的方法

        var count = array.filter(function(value) { return value !== undefined }).length

        【讨论】:

          【解决方案7】:

          试试这个

          var testvar = [  ];
          testvar[1] = 2;
          testvar[200] = 3;
          
          var size = testvar.filter(function(value) { return value !== undefined }).length;
          
          console.log(size);
          

          输出

          2
          

          【讨论】:

            【解决方案8】:

            你可以这样做,它的工作原理。

            <script>
             var testvar = new Object();
             testvar["1"] = 2;
             testvar["200"] = 3;
            
             Object.size = function(obj) {
              var size = 0, key;
              for (key in obj) {
                 if (obj.hasOwnProperty(key)) size++;
              }
              return size;
             };
            
             // Get the size of an object
            var size = Object.size(testvar);
             alert(size);
             </script>
            

            【讨论】:

            【解决方案9】:

            因为您要在索引 200 处添加一个项目,如果您想找到可以使用的所有未定义值,这将在填充了许多未定义值的数组中解析:

            var sum = testvar.reduce(function(sum) { return sum+1; }, 0); // 2
            

            JavaScript 不支持关联数组,但您可以使用对象来代替:

            var a = {};
            a[1] = 1;
            a[200] = 1;
            
            // To get the length is a little tricky
            var length = Object.keys(a).length; // 2
            

            【讨论】:

              【解决方案10】:

              是的,前面的答案是怎么说的。 Javascript 数组是基于 null 的,并且它们的长度每次都从 0 开始。

              您要归档什么?仅获取您拥有的列表的长度?

              为什么将 3 设置为位置 200?您的代码需要这样吗?

              你可以做的是:

              var testvar = {'1': 2, '200': 3};
              
              function length(arr) {
                var c = 0;
                for(prop in arr) {
                   if(typeof arr[prop]=='number')
                     c++;
                }
                return c;
              }
              length(testvar);
              

              这会给你正确的长度!

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-01-27
                • 1970-01-01
                相关资源
                最近更新 更多