有条不紊的子阵列功能javascript

时间:2015-10-27 12:24:15

标签: javascript arrays

我创建了一个JavaScript函数,它可以提取数组中所有可以继承的子数组,并将它们返回到另一个数组中 这是代码

function contigious_sub_array (arr) {
    var output = [], worker = [];

    for (var i = 0; i < arr.length; i++) {
        worker = [];
        output.push(arr[i]);    // On ajoute la première val
        var chien = arr[i];
        worker.push(chien); // Tableau worker qui va contenir la première val + les suivantes

        for (var j = (i + 1); j < arr.length; j++) {
            worker.push(arr[j]);
            output.push(worker);
        };
        worker = [];
    };
    return output;
}

然而,当我做console.log(contigious_sub_array([1, 2, 3]))时, 我没有得到预期的结果,索引1的值为[1, 2, 3]时应为[1, 2] 这可能有什么问题?

1 个答案:

答案 0 :(得分:0)

有几个问题可能导致问题。首先,将worker数组推送到output数组;这只会将对前者的引用推送到后者,因此当您再次修改worker时,该更改会反映在output数组的多个条目中。

其次,你的两个循环结合起来迭代输入数组的整个长度,因此最终output中的一个条目与输入arr相同。

您可以使用.slice()创建数组的副本来解决前一个问题 - 请注意,它只会创建一个浅表副本,因此如果您的数组包含对象而不是数字,这将无法工作。

如果数组的长度与输入数组相同,则可以通过合并检查来排除output数组。这段代码也有些简化:

function contigious_sub_array (arr) {
  var output = [], worker = [];
  for (var i = 0; i < arr.length; i++) {
      worker = [];

      for (var j = i; j < arr.length; j++) {
          worker.push(arr[j]);
          if (worker.length != arr.length) {
            output.push(worker.slice());
          }
      };

  };
  return output;
}

示例输出:

enter image description here

注意:这假设您不希望output中与[1, 2]对应的条目以及与[2, 1]对应的其他条目