Почему это работает в цикле for, но не forEach? (массив не является ошибкой конструктора) - PullRequest
2 голосов
/ 01 июля 2019

Сейчас я пытаюсь создать массив объектов с номерами, превышающими 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 не может сделать? Есть ли другой способ, которым я должен выполнить это?

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

Если вы работаете с небольшими массивами, комбинация объединения и разбиения - это краткий способ отфильтровать нули ...

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 голос
/ 01 июля 2019

Вы можете использовать метод 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

0 голосов
/ 01 июля 2019

У вас есть хотя бы одна проблема в вашем коде - внутри 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...