JavaScript Array Push Отсутствующие значения - PullRequest
0 голосов
/ 20 ноября 2018

Эта функция берет массив и разбивает его на отдельные массивы, создает смещение в начале и переносит его в другой массив.Проблема у меня не все числа из исходного массива (arr1) включены в чанки.Вы можете увидеть результат в ссылке, которую я предоставил ниже.Он пропускает числа 5, 13, 21, 29 и 30. Кто-нибудь может объяснить, почему это происходит?

function chunkifyArray(input, chunkSize, offset) {

    const output = [];

    let tmp = offset ? new Array(offset).fill('') : [];

    for(var i = 0; i < input.length; i++){
        if (tmp.length < chunkSize) {
            tmp.push(input[i]);
        } else {
            output.push(tmp);
            tmp = [];     
        }
    }

    return output;
}

var arr1 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30'];
console.log(chunkifyArray(arr1, 7, 3));

https://jsbin.com/zucaguvoti/edit?js,console

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Я немного изменил ваш код, чтобы получить желаемый результат.Вы можете использовать оператор %, а также не забудьте добавить последнюю часть в конце цикла for:

var data = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30'];

function chunkifyArray(input, chunkSize, offset=0) {
  let output = [], tmp = [];
  input = new Array(offset).fill('').concat(input);
  for (var i = 0; i < input.length; i++) {
    tmp.push(input[i])
    if (i && i%chunkSize == 0) {
        output.push(tmp);
	tmp = []
    }
  }
  output.push(tmp);  // add the remaining ones
  return output;
}

console.log(chunkifyArray(data, 7, 3));

Вы можете chunk массив с ES6 и Array.reduce:

const data = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30']

const chunkBy = (arr, by=2, offset=0) => new Array(offset).fill('').concat(arr)
 .reduce((r,c,i) => (i%by==0 ? r.push([c]) : r[r.length-1] = [...r[r.length-1], c], r), [])
		
console.log(chunkBy(data, 7, 3))

Если не в форме compact, это будет выглядеть следующим образом:

const data = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30']

const chunkBy = (arr, by=2, offset=0) => {
   arr = new Array(offset).fill('').concat(arr)
   return arr.reduce((r,c,i) => {
     if(i%by==0)
       r.push([c])
     else 
      r[r.length-1] = [...r[r.length-1], c]
     return r
   }, [])
}
		
console.log(chunkBy(data, 7, 3))
0 голосов
/ 20 ноября 2018

Поскольку вы никогда не нажимаете эти значения - вы очищаете TMP InSad… Попробуйте это:

for(var i = 0; i < input.length; i++){
    tmp.push(input[i]);
    if (tmp.length == chunkSize) {
        output.push(tmp);
        tmp = [];     
    }
}

Отредактировано, чтобы последний блок помещался на выход ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...