【问题标题】:split an array into two arrays based on odd/even position根据奇数/偶数位置将数组拆分为两个数组
【发布时间】:2011-12-28 12:41:47
【问题描述】:

我有一个数组Arr1 = [1,1,2,2,3,8,4,6]

如何根据元素位置的奇数/偶数将其拆分为两个数组?

subArr1 = [1,2,3,4]
subArr2 = [1,2,8,6]

【问题讨论】:

  • 请阅读格式化常见问题;你已经有将近一年的时间这样做了。
  • 这有什么意义?我真的不明白你的问题是什么,或者你想根据什么标准来拆分它们。多一些信息会很棒。
  • @Termi:很清楚(虽然大部分来自标题)
  • @TomalakGeret'kal:你说得对,我的错。我刚刚飞过它。
  • 那是说...你想要 JavaScript 还是 CoffeeScript 的答案?学会精确!

标签: javascript coffeescript


【解决方案1】:

你可以试试:

var Arr1 = [1,1,2,2,3,8,4,6],
    Arr2 = [],
    Arr3 = [];

for (var i=0;i<Arr1.length;i++){
    if ((i+2)%2==0) {
        Arr3.push(Arr1[i]);
    }
    else {
        Arr2.push(Arr1[i]);
    }
}

console.log(Arr2);

JS Fiddle demo.

【讨论】:

  • 伙计,我可以擅长某事,如果我能避免分心...叹息。谢谢! (并在..中编辑了链接!)XD
【解决方案2】:

我猜你可以让 2 个循环增加 2,在第一个循环中从 0 开始,在第二个循环中从 1 开始

【讨论】:

    【解决方案3】:

    没有模运算符的方法:

    var subArr1 = [];
    var subArr2 = [];
    var subArrayIndex = 0;
    var i;
    for (i = 1; i < Arr1.length; i = i+2){
        //for even index
        subArr1[subArrayIndex] = Arr1[i];
        //for odd index
        subArr2[subArrayIndex] = Arr1[i-1];
        subArrayIndex++;
    }
    //For the last remaining number if there was an odd length:
    if((i-1) < Arr1.length){
        subArr2[subArrayIndex] = Arr1[i-1];
    }
    

    【讨论】:

    • 这不是最简单的方法。
    • 好吧,我同意我应该改变第一句话并写:“一种没有模计算的方法”
    【解决方案4】:

    使用嵌套数组会更容易:

    result = [ [], [] ]
    
    for (var i = 0; i < yourArray.length; i++)
        result[i & 1].push(yourArray[i])
    

    如果您的目标是现代浏览器,您可以将循环替换为 forEach

    yourArray.forEach(function(val, i) { 
        result[i & 1].push(val)
    })
    

    【讨论】:

      【解决方案5】:

      使用underscore的函数式方法:

      xs = [1, 1, 2, 2, 3, 8, 4, 6]
      partition = _(xs).groupBy((x, idx) -> idx % 2 == 0)
      [xs1, xs2] = [partition[true], partition[false]]
      

      [编辑] 现在有_.partition:

      [xs1, xs2] = _(xs).partition((x, idx) -> idx % 2 == 0)
      

      【讨论】:

        【解决方案6】:

        只是为了好玩,分两行,因为它已被标记为咖啡脚本:

        Arr1 = [1,1,2,2,3,8,4,6]
        
        [even, odd] = [a, b] = [[], []]
        ([b,a]=[a,b])[0].push v for v in Arr1
        
        console.log even, odd
        # [ 1, 2, 3, 4 ] [ 1, 2, 8, 6 ]
        

        【讨论】:

          【解决方案7】:
          odd  = arr.filter (v) -> v % 2
          even = arr.filter (v) -> !(v % 2)
          

          或者在更惯用的 CoffeeScript 中:

          odd  = (v for v in arr by 2)
          even = (v for v in arr[1..] by 2)
          

          【讨论】:

          • 应该是arr.filter((v, i) =&gt; i % 2),因为OP的问题是基于位置而不是价值
          【解决方案8】:

          作为使用下划线链接功能对 tokland 解决方案的单行改进:

          xs = [1, 1, 2, 2, 3, 8, 4, 6]
          _(xs).chain().groupBy((x, i) -> i % 2 == 0).values().value()
          

          【讨论】:

            【解决方案9】:
            var Arr1 = [1, 1, 2, 2, 3, 8, 4, 6]
            var evenArr=[]; 
            var oddArr = []
            
            var i;
            for (i = 0; i <= Arr1.length; i = i + 2) {
                if (Arr1[i] !== undefined) {
                    evenArr.push(Arr1[i]);
                    oddArr.push(Arr1[i + 1]);
                }
            }
            console.log(evenArr, oddArr)
            

            【讨论】:

              【解决方案10】:

              filters 是一种非静态和非内置数组方法,它接受 literal object 的过滤器函数并返回数组的 literal object,其中输入和输出由对象键映射。

                  Array.prototype.filters = function (filters) {
                    let results = {};
                    Object.keys(filters).forEach((key)=>{
                       results[key] = this.filter(filters[key])   
                    }); 
                    return results;
                  }
                  //---- then : 
                  
                  console.log(
                    [12,2,11,7,92,14,5,5,3,0].filters({
                      odd:  (e) => (e%2),
                      even: (e) => !(e%2)
                    })
                  )

              【讨论】:

                猜你喜欢
                • 2015-01-28
                • 2012-09-06
                • 1970-01-01
                • 2022-10-01
                • 1970-01-01
                • 2013-12-04
                • 1970-01-01
                • 2017-05-27
                • 1970-01-01
                相关资源
                最近更新 更多