【问题标题】:Programming logic for loops循环的编程逻辑
【发布时间】:2012-03-18 17:43:41
【问题描述】:

我有以下数字:1,2,3,4,5,6,7,8,9,10,11,12...

我有一个数字 n,比如 n=2,然后我想要用这些数字划分的数组,即:

For `n=2`
Result array : 1,2, 5,6, 9,10, 13,14, ... <br />
Result array 2 : 3,4, 7,8, 11,12 ...

For `n=3`
Result array : 1,2,3, 7,8,9, ... <br />
Result array 2 : 4,5,6, 10,11,12...

我似乎连这个逻辑都搞不清楚。
我尝试在 google 上搜索类似的内容,但找不到。
请帮忙。

【问题讨论】:

  • 到目前为止你有什么?你在使用for 循环吗?
  • 是的,我正在尝试使用 for 循环和一组模数组合。我想@Truth 的答案应该有效。谢谢。
  • 接受的答案是您想要的,还是您想要问题中显示的结果?

标签: javascript loops logic


【解决方案1】:

尚不完全清楚您希望如何将分块输出在两个数组之间划分,但您可以通过使用 JavaScript 核心 Array slice() method 获得大部分方式:

function chunk(arr, n) {
  var a=[], i;
  for (i=0; i<arr.length; i += n) {
    a.push(arr.slice(i, i+n));
  }
  return a;
}

var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
chunk(a, 2) # => [[1,2], [3,4], [5,6], [7,8], [9,10], [11,12]]
chunk(a, 3) # => [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
chunk(a, 5) # => [[1,2,3,4,5], [6,7,8,9,10], [11,12]]

根据您的问题,您可以将这些结果放入两个数组中:

function chunk2(arr, n) {
  var a1=[], a2=[], a=a1, len=arr.length, i;
  for (i=0; i<len; i+=n, a=(a===a1?a2:a1)) {
    a.push(arr.slice(i, i+n));
  }
  return [a1, a2];
}
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var x = chunk2(a, 2);
x[0]; // => [[1,2], [5,6], [9,10]]
x[1]; // => [[3,4], [7,8], [11,12]]
x = chunk2(a, 3);
x[0]; // => [[1,2,3], [7,8,9]]
x[1]; // => [[4,5,6], [10,11,12]]

【讨论】:

  • 不会将项目分成两个数组,如示例所示。
【解决方案2】:
function array_chunk (input, size, preserve_keys) {
    // Split array into chunks  
    // 
    // version: 1109.2015
    // discuss at: http://phpjs.org/functions/array_chunk
    // +   original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // %        note 1: Important note: Per the ECMAScript specification, objects may not always iterate in a predictable order
    // *     example 1: array_chunk(['Kevin', 'van', 'Zonneveld'], 2);
    // *     returns 1: [['Kevin', 'van'], ['Zonneveld']]
    // *     example 2: array_chunk(['Kevin', 'van', 'Zonneveld'], 2, true);
    // *     returns 2: [{0:'Kevin', 1:'van'}, {2: 'Zonneveld'}]
    // *     example 3: array_chunk({1:'Kevin', 2:'van', 3:'Zonneveld'}, 2);
    // *     returns 3: [['Kevin', 'van'], ['Zonneveld']]
    // *     example 4: array_chunk({1:'Kevin', 2:'van', 3:'Zonneveld'}, 2, true);
    // *     returns 4: [{1: 'Kevin', 2: 'van'}, {3: 'Zonneveld'}]

    var x, p = '', i = 0, c = -1, l = input.length || 0, n = [];

    if (size < 1) {
        return null;
    }

    if (Object.prototype.toString.call(input) === '[object Array]') {
        if (preserve_keys) {
            while (i < l) {
                (x = i % size) ? n[c][i] = input[i] : n[++c] = {}, n[c][i] = input[i];
                i++;
            }
        }
        else {
            while (i < l) {
                (x = i % size) ? n[c][x] = input[i] : n[++c] = [input[i]];
                i++;
            }
        }
    }
    else {
        if (preserve_keys) {
            for (p in input) {
                if (input.hasOwnProperty(p)) {
                    (x = i % size) ? n[c][p] = input[p] : n[++c] = {}, n[c][p] = input[p];
                    i++;
                }
            }
        }
        else {
            for (p in input) {
                if (input.hasOwnProperty(p)) {
                    (x = i % size) ? n[c][x] = input[p] : n[++c] = [input[p]];
                    i++;
                }
            }
        }
    }
    return n;
}

取自 here。这是搜索 javascript 数组块时的第一个结果。

【讨论】:

  • 非常感谢!我一直在用“数组集输出”、“使用模数来分隔循环”等术语进行搜索,但从未得到任何好的结果。
【解决方案3】:

您可以像这样将项目分成两个数组:

function chunk(arr, cnt) {
  var result = [[],[]];
  for (var i = 0; i < arr.length; i++) result[Math.floor(i / cnt) % 2].push(arr[i]);
  return result;
}

演示:http://jsfiddle.net/Guffa/t7agt/

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2019-01-08
    相关资源
    最近更新 更多