为什么这在for循环中起作用,但在forEach中却不起作用? (数组不是构造函数错误)

时间:2019-07-01 14:38:17

标签: javascript arrays loops

现在,我正在尝试创建数字大于0的对象数组,当数字为0时数组结束,而数字大于0应当创建一个新的数组(因此该函数应返回一个数组数组,当中间的数字为0时将其分解。

输入和所需的输出:

input = [1,2,3,4,0,0,0,9,9,0,0]
output = [[1,2,3,4][9,9]]

我的功能(到目前为止):

function group(Array) {
  let allArray = []
  let runGroup = new Array()
  Array.forEach(function(runtimeI,index) {
    if (runtimeI > 0)
   { 
      runGroup[i] = new Array()
      runGroup[i].push(runtimeI)
    }


    }
  )
  allArray.push(runGroup[i])

}
 array = [10,0,0,1,1,2,0,0,15,0,0,0,5,5,5,]

console.log(group(array))

我创建的函数引发错误,提示array is not a constructor

工作示例函数(创建我需要的结构)

var squares = new Array();
for(var i = 0; i <= 8; i++)
{
    squares[i] = new Array();
    for(var j = (i * 20) + 1; j <= 20 * i + 20; j++)
        if (squares[i] == null)
            squares[i] = j;
        else
            squares[i].push(j);
}

console.log(squares)

所以我想我的问题是,forEach无法执行for循环吗?我还有另一种方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:2)

如果您要处理较小的数组,则结合使用连接和拆分是清除0的简洁方法...

let input = [1,27,3,4,0,0,0,9,9,0,0];
let arrays = input.join('&').split('&0');
let output = arrays.filter(a => a).map(s => s.split('&').filter(s => s).map(s => parseInt(s)))
console.log(output);

英语:Join产生一个包含所有输入数字的字符串。拆分为“ 0”会生成一个数组数组,在定界符(“ 0”)处为空。删除空的空格,然后再次拆分以产生数字数组。

或者,当您的OP开始时,它可能更适合使用较大的迭代样式的大型数组。

let input = [1, 27, 3, 4, 0, 0, 0, 9, 9, 0, 0];
let output = [];
let runGroup = [];

input.forEach(num => {
  if (num === 0) {
    if (runGroup.length) {
      output.push(runGroup);
      runGroup = [];
    }
  } else {
    runGroup.push(num);
  }
});
console.log(output);

答案 1 :(得分:1)

您可以按以下方式滥用split / join方法

// Build a string from your initial array
var step1 = input.join('#')
// Remove the '0' and build arrays around it
var step2 = step1.split('#0')
// Filter empty values
var step3 = step2.filter(v => v)
// Build the final result
var output = step3.map(v => v.split('#').filter(s => s))

enter image description here

答案 2 :(得分:0)

您的代码中至少有一个问题-在Array.forEach中,您使用索引i而不是index。或者,您可以使用以下代码

input = [1,2,3,4,0,0,0,9,9,0,0]

output = input.join().replace(/(,0)+/g,'-').replace(/-$/,'')
              .split('-,').map(x=>x.split(',').map(y=>+y))

console.log(JSON.stringify(output));