【问题标题】:How do I extract even elements of an Array?如何提取数组的偶数元素?
【发布时间】:2011-08-30 12:47:07
【问题描述】:
var arr = [4, 5, 7, 8, 14, 45, 76];

function even(a) {
  var ar = [];

  for (var i = 0; i < a.length; i++) {
    ar.push(a[2 * i + 1]);
  }

  return ar;
}

alert(even(arr));

http://jsbin.com/unocar/2/edit

我已尝试使用此代码来输出数组的偶数(索引)元素。它可以工作,但它也会输出一些空元素。如何修复此代码以仅输出现有元素?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    要么使用模数:

    for (var i = 0; i < a.length; i++) {
        if(i % 2 === 0) { // index is even
            ar.push(a[i]);
        }
    }
    

    或通过相应地递增i 来跳过每个第二个元素:

    for(var i = 0; i < a.length; i += 2) {  // take every second element
        ar.push(a[i]);
    }
    

    注意:您的代码实际上是从数组中获取具有 odd 索引的元素。如果这是您想要的,则必须使用 i % 2 === 1 或分别以 var i = 1 开始循环。

    【讨论】:

    • 可能,我说错了。我的意思是元素的序数 - 例如 - 5 是第二个,8 是第四个......等等......
    • 从第二个元素开始:for(var i = 1;
    【解决方案2】:

    对于 IE9+ 使用 Array.filter

    var arr = [4,5,7,8,14,45,76];
    var filtered = arr.filter(function(element, index, array) {
      return (index % 2 === 0);
    });
    

    使用旧 IE 的后备,所有其他浏览器都可以没有此后备

    if (!Array.prototype.filter)
    {
      Array.prototype.filter = function(fun /*, thisp */)
      {
        "use strict";
    
        if (this === void 0 || this === null)
          throw new TypeError();
    
        var t = Object(this);
        var len = t.length >>> 0;
        if (typeof fun !== "function")
          throw new TypeError();
    
        var res = [];
        var thisp = arguments[1];
        for (var i = 0; i < len; i++)
        {
          if (i in t)
          {
            var val = t[i]; // in case fun mutates this
            if (fun.call(thisp, val, i, t))
              res.push(val);
          }
        }
    
        return res;
      };
    }
    

    【讨论】:

      【解决方案3】:

      这将在 2018 年生效 :)

      取奇数索引并应用于过滤器

      var arr = [4, 5, 7, 8, 14, 45, 76,5];
      let filtered=arr.filter((a,i)=>i%2===1);
      console.log(filtered);

      【讨论】:

      • 如果数组有重复元素,这将不起作用。
      【解决方案4】:

      即使这个问题已经很老了,我也想添加一个单线过滤器:
      奇数:arr.filter((e,i)=&gt;i%2)
      偶数:arr.filter((e,i)=&gt;i%2-1)
      一种更“合法”的方式偶数:arr.filter((e,i)=&gt;!(i%2))

      没有必要像 sumit 所说的那样与===1 核对。 mod 2 已经返回 0 或 1,您可以让它们被解释为布尔值。

      您可以使用i&amp;1 代替i%2,虽然它可以提高大型数组的性能,但它只能用于31 位整数。

      【讨论】:

        【解决方案5】:

        您为什么不尝试使用 % 运算符。它给你一个部门的剩余部分。

        替换循环块
        if ((i % 2) === 0) {
            ar.push(a[i])
        }
        

        【讨论】:

          【解决方案6】:
          var arr = [4,5,7,8,14,45,76];
          
          function even(a)
          {
            var ar = [];  
          
            for (x in a)
            {
          
              if((a[x]%2)==0)
              ar.push(a[x]);  
          
            }
          return ar;
          }
          
          alert(even(arr));
          

          【讨论】:

          【解决方案7】:

          我只是想解释一下为什么你的结果不是你所期望的,因为其他人都展示了出色的解决方案。您正在迭代一个大小为 N 的数组,因此您的结果数组将尝试将元素推入一个数组中,这将导致大小为 N。由于在原始数组中只会找到 N/2,因此您的结果数组将用空白填充其余部分以填充在 N 的其余部分。因此,如果您在插入之前检查 a[2*i] 是否存在或检查 a[i] % 2 == 0 是否存在,则生成的数组将仅包含偶数索引值

          【讨论】:

            【解决方案8】:

            您需要像这样测试元素的均匀度:

            var arr = [4,5,7,8,14,45,76];
            
            function even(a){
              var ar = [];
            
              for (var i=0; i<a.length;i++){
                if (a[i] % 2 === 0)
                {
                  ar.push(a[i]);
                }
            
              }
            
            return ar;
            }
            
            alert(even(arr));
            

            %2 是取模运算符,它返回整数除法的余数。

            【讨论】:

              猜你喜欢
              • 2016-08-29
              • 2020-07-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-12-28
              • 1970-01-01
              相关资源
              最近更新 更多