【问题标题】:Loop 'n' elements in groups in each iteration在每次迭代中循环组中的“n”个元素
【发布时间】:2015-02-24 17:28:26
【问题描述】:

假设我有这个数组:

var arr = [1,2,3,4,5,6,7,8,9,10]

示例:我想构造 5 个数组,其中每一对都变成这样,

arr1 = [1,2]
arr2 = [2,4]
arr3 = [5,6]

这当然可以用模运算符(%)来解决,因为它们只是对 - 所以它变成:

for (var i = 0; i < arr.length; i++) {
  if(arr[i] % 2 === 0)
    window['arr' + i].push(arr[i], arr[i - 1])
}

还有其他方法,例如嵌套循环等。

我觉得这可以用更简单的方法解决,所以我希望看到更多建议


那么有什么优雅的方法可以循环数组中的每个“n”项,对它们执行一些操作,然后继续处理下一个“n”个元素。

更新:

上面的例子处理了一个 10 元素数组中的 2 个元素——这完全是随机的。我不是在寻找一种方法来处理数组中的对 - 问题是关于如何循环数组中的每个 N 个元素,对这些 N 个元素执行任何操作并继续下一个N 个元素

我也不打算创建新数组 - 问题仅与迭代原始数组有关。

【问题讨论】:

  • 这似乎是一个奇怪的要求。你为什么要动态创建单独的变量?我认为至少你会想要创建一个数组数组?
  • 动态创建新的arr 变量仅用于代码示例 - 它与手头的问题无关
  • 有很好的分割数组的例子,在这个问题的答案*.com/questions/7273668/…
  • 一对的逻辑意义是什么?数组中有 10 个元素,5 对,并且在对中重复,所以没有使用元素。这纯粹是随机的吗?

标签: javascript arrays


【解决方案1】:

使用普通的旧 for 循环,像这样

var N = 3;
for (var i = 0; i < array.length; i += N) {
    // Do your work with array[i], array[i+1]...array[i+N-1]
}

【讨论】:

    【解决方案2】:

    只需在 for 循环中增加 n

    for (var i = 0; i < arr.length; i += 2)
        console.log(arr[i], arr[i + 1]);
    

    您可以编写一个函数来自动通过n 为您遍历数组:

    function walk(arr, n, fn) {
        for (var i = 0; i < arr.length; i += n)
            fn(arr.slice(i, i + n));
    }
    
    walk([1,2,3,4,5,6], 2, function (segment) {
        console.log(segment);
    });
    

    【讨论】:

      【解决方案3】:

      我觉得这可以用更简单的方法解决

      我认为more efficient 在这里会比simpler 产生更好的情绪。而就效率而言,只有在实际需要时才能对数据进行分页。

      下面的例子是基于iter-ops库和操作符page:

      import {pipe, page} from 'iter-ops';
      
      const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
      
      const i = pipe(arr, page(2)); //=> Iterable<number[]>
      
      // iteration below will trigger the actual paging,
      // one page at a time:
      
      for (const a of i) {
          console.log(a); //=> [1, 2], [2, 4], [5, 6]
      }
      

      附:如果iter-ops,我是作者。

      【讨论】:

      • 只是一个免责声明,你写这个库
      • @nicholaswmin 添加了免责声明 ;)
      最近更新 更多