Перебор массива каждые 3 элемента

417
24 июня 2017, 13:58

Приветствую! Подскажите пожалуйста, как можно перебирать массив каждые 3 элемента. У меня есть массив var arr = [[1, 2, 3, 4, 5, 6, 7, 8, 9]] Мне нужно через for вывести так:

Первый: 1, 2, 3.
Второй: 4, 5, 6.
Третий: 7, 8, 9.

Я сделал все через такой перебор:

for( var i = 0; i < 3; i++){
     for( var j = 0; j < 3; j++){
         console.log(arr[i][j]);
     }
 }

и так три раза, увеличивая i и j на 3. Как это можно автоматизировать, что бы не 3 раза выводить for. Большое всем спасибо за ответы! А если у меня есть такой массив:

arr = [
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9]
]

И мне необходимо найти первые три индекса каждого значения, что бы получилось так: [1,2,3,1,2,3,1,2,3],[4,5,6,4,5,6,4,5,6] и тд. Как это можно сделать? Заранее большое спасибо!

Answer 1

Вот как можно это сделать:

var arr = [[1, 2, 3, 4, 5, 6, 7, 8, 9], [12, 3, 4, 11, 4, 5, 6, 7]]; 
    var tmp_arr = []; 
    var arr_3 = []; 
    for(var j=0; j<arr.length;j++){ 
        arr_3[j] = []; 
        for( var i = 0; i < arr[j].length; i=i+3){ 
            tmp_arr = []; 
            tmp_arr.push(arr[j][i]); 
            if(typeof arr[j][i+1] != 'undefined'){ 
                tmp_arr.push(arr[j][i+1]); 
            } 
            if(typeof arr[j][i+2] != 'undefined'){ 
                tmp_arr.push(arr[j][i+2]); 
            } 
            arr_3[j].push(tmp_arr); 
        } 
    } 
    console.log(arr_3);

Вот второй вариант после вашего обновления вопроса:

let arr = [[1, 2, 3, 4, 5, 6, 7, 8, 9], [12, 3, 4, 11, 4, 5, 6, 7]]; 
 
let subarr_count = 3; 
 
 
function new_arr(arr, subarr_count){ 
    let tmp_arr = []; 
    let arr_3 = []; 
    for(var j=0; j<arr.length;j++){ 
 
        let ar_count = Math.floor(arr[j].length/subarr_count); 
 
        arr_3[j] = []; 
 
        tmp_arr = []; 
 
        tmp_arr.push(arr[j][0]); 
 
        if(typeof arr[j][1] != 'undefined'){ 
            tmp_arr.push(arr[j][1]); 
        } 
        if(typeof arr[j][2] != 'undefined'){ 
            tmp_arr.push(arr[j][2]); 
        } 
        for(var i=0; i<ar_count; i++){ 
            arr_3[j].push(tmp_arr); 
        } 
    } 
    return arr_3; 
} 
console.log(new_arr(arr, subarr_count));

Answer 2

Вот так будет работать на разное кол-во

var array = [1, 2, 3, 4, 5, 6, 7, 8]; 
 
function breakUp(array){ 
  for (var i = 0; i < array.length; i += 3) { 
    console.log(array.slice(i, i + 3)); 
  } 
} 
 
breakUp(array);

Answer 3

Насколько я понял, внутренних массивов может быть сколько угодно, поэтому я немного усложнил входной массив.

var arr1 = [ 
  [1, 2, 3, 4, 5, 6, 7, [8, [9, 10]]], 
  [11, 12, [13, [14,15]]] 
]; 
 
function getArray(arr, num) { 
  var result = []; 
  var i = 0; 
  var calculateArr = function(arr) { 
    arr.forEach(function(item) { 
      if (Array.isArray(item)) { 
        calculateArr(item); 
      } else { 
        let reminder = Math.floor(i / num); 
        if (!result[reminder]) { 
          result[reminder] = []; 
        } 
        result[reminder].push(item); 
        i++; 
      } 
    }); 
  } 
  calculateArr(arr); 
 
  return result; 
} 
 
console.log('arr1  = ' + JSON.stringify(getArray(arr1, 3))); 
 
var arr2 = [[1, 2, 3, 4, 5, 6, 7, 8, 9]] 
 
console.log('arr2 = ' + JSON.stringify(getArray(arr2, 3)));

После обновления вопроса решение приняло следующий вид:

var arr = [ 
  [1, 2, 3, 4, 5, 6, 7, 8, 9], 
  [1, 2, 3, 4, 5, 6, 7, 8, 9], 
  [1, 2, 3, 4, 5, 6, 7, 8, 9] 
]; 
 
function getNewArr(arr) { 
  let result = []; 
  arr.forEach(function(innerArr) { 
    innerArr.forEach(function(item, i) { 
      let reminder = Math.floor(i / 3); 
      if (!result[reminder]) { 
        result[reminder] = []; 
      } 
      result[reminder].push(item); 
    }); 
  }); 
 
  return result; 
} 
 
console.log(JSON.stringify(getNewArr(arr)));

Answer 4

Если просто вывести данные.

  var arr = [[1, 2, 3, 4, 5, 6, 7, 8, 9], [11, 12, 13, 14, 15, 16, 17, 18, 19]], 
    length = 3, 
    test = document.getElementById('test'); 
     
  function display() { 
    arr.forEach(item => { 
      for(var i = 0; i < item.length; i++) { 
          test.insertAdjacentHTML('beforeend', ( !i || i % length ? " ": "<br/>") + item[i]) 
      } 
      test.insertAdjacentHTML('beforeend', "<br/>") 
    }) 
  } 
   
   
  display(); 
  
<div id="test"></div>

READ ALSO
Кодировка при выводе ответа от сервера в текстовое поле

Кодировка при выводе ответа от сервера в текстовое поле

С помощью функции fetch (js) получаю ответ от сервераОтвет приходит в виде простой текстовой строки, в которой в моем случае есть символы кириллицы

349
Как указать с каким листом работать? Google App Script

Как указать с каким листом работать? Google App Script

Добрый день Есть следующий код

374
Сортировка по дате в React data grid

Сортировка по дате в React data grid

Предусмотрена ли сортировка по дате в React data grid? Если да, то как ее можно вызвать? В примерах вся сортировка работает только по строке:

665
Отмена показа тех же самых картинок после нажатия на кнопку назад fancybox 3

Отмена показа тех же самых картинок после нажатия на кнопку назад fancybox 3

Использую в качестве фотогаллереи fancybox 3Возникает следующая ситуация, когда я нажимаю на фотографию и начинаю листать галерею всё норм

376