【问题标题】:Why does this work in a for loop but not forEach? (array is not a constructor error)为什么这在 for 循环中有效,但在 forEach 中无效? (数组不是构造函数错误)
【发布时间】:2019-07-01 14:38:17
【问题描述】:

现在我正在尝试创建一个数字大于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)

所以我想我的问题是,对于 for 循环,是否有一些 forEach 不能做的事情?我还有其他方法可以做到这一点吗?

【问题讨论】:

  • 您发布的.forEach() 代码有几个错误;你检查过控制台吗?
  • Array.forEach?你只是在调用 forEach ......没什么特别的。这应该迭代什么?
  • group(Array) 那更糟new Array() 现在不创建新数组,而是在输入上调用 new
  • 首先不要隐藏Array 构造函数。使用数组字面量初始化器也有帮助 - [] 而不是 new Array 但遮蔽 Array 仍然令人困惑。
  • function group(Array) { — 不要用同名的局部变量来掩盖全局函数。不要将以大写字母开头的变量用于非构造函数。

标签: javascript arrays loops


【解决方案1】:

如果您正在处理较小的数组,则连接和拆分的组合是过滤掉 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);

【讨论】:

  • 如果数字大于 9 怎么办?
  • @KamilKiełczewski - 同意。添加了一个非数字分隔符。
  • 我可能会查看具有数千个值的数组,但我会考虑到这一点来检查解决方案。谢谢!
  • @JasonHarder - 编辑以迭代地处理更大的数组。
  • 谢谢@danh !!很好的答案!
【解决方案2】:

您可以如下滥用 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))

【讨论】:

  • 如果数字大于 9 怎么办?
【解决方案3】:

您的代码中至少有一个问题 - 在 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));

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2017-07-07
    • 2014-04-21
    • 2021-08-15
    • 2020-06-16
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多