2015-12-02 2 views
0

Вопрос прост. У меня есть массив, что-то вродеСплит-массив в кусках с небольшой модификацией

let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
    maxChunkLength = 3; 

мне нужно разделить его на ряд массивов, чтобы получить это:

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

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

Кто-нибудь знает, как это сделать?

+2

... А что вы пробовали до сих пор? Вам нужно будет выяснить, сколько раз вам нужно создать массив, поэтому 'numChunks = array.length/maxChunkLength' и цикл while (x Adjit

+0

« лучший способ », скорее всего, вопрос мнения ... что вы подразумеваете под «лучшим»? –

+0

Самый красивый. –

ответ

4

эта функция может работать для вас,

function splitArray(array, chunk){  
    var i,j, rslt = []; 
    chunk = chunk - 1; 
    for (i=0,j=array.length; i<j; i+=chunk) { 
     rslt.push(array.slice(i,i+chunk +1)); 
    } 
    return rslt; 
} 

примеры

splitArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3); //[[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9], [9, 10]] 
+0

Спасибо, мужик, это здорово! –

+0

приветствуется ......... – azad

0

Это работает для вас?

var originalArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 

var maxChunkLength = 3 

var newArray = []; 

for (var i = 0; i < originalArray.length; maxChunkLength += 2) { 

    var tempArray = []; 

    for (var j = i; j < i+maxChunkLength; j++) { 

     if (typeof originalArray[j] !== "undefined") { 

      tempArray.push(originalArray[j]); 
     } 
    } 

newArray.push(tempArray); 

tempArray = []; 
} 
+2

Имейте в виду, что 'maxChunkLength' является субъектом для изменения, поэтому вам нужно будет сделать приращение 'i + = maxChunkLength-1' – Adjit

+1

Кроме того, в этом примере последний массив имеет только два элемента:' [9, 10] '. Вы можете добавить чек для этого. –

+0

Это будет работать только для массивов с длиной, кратной 3 – 11thdimension

0

Это должно работать,

var arr = [1,2,3,4,5,6,7,8]; 
var el1 = 0, el2 = 0, el3 = 0; 
var result = []; 
var splitLength = 3; 
for(var i = 0; i < arr.length; i += (splitLength -1)) { 
    var tempArr = []; 
    for(var j = 0; j < splitLength && arr[i+j]; j++) { 
     tempArr.push(arr[i+j]); 
    } 

    result.push(tempArr); 
} 

console.log("[" + result.join("]\n[") + "]"); 
1

Это примерно в два раза быстрее, чем принятый ответ ,

function chunk(arr, chunkSize) { 
 
    var curr = [], result = [], i, j; 
 

 
    for (i=0, j=arr.length; i<j; i++) { 
 
     curr.push(arr[i]);   
 
     if (curr.length === chunkSize) { 
 
      result.push(curr); 
 
      curr = [arr[i]]; 
 
     } 
 
    }  
 

 
    if (curr.length !== chunkSize) {  
 
     result.push(curr); 
 
    } 
 
    
 
    return result; 
 
} 
 

 
document.write(JSON.stringify(chunk([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3)));

+0

это на самом деле быстрее из-за дополнительных шагов, связанных с вызовом '.slice()' – Adjit

+0

кажется, что OP ищет «красоту», а не скорость. Зеркало, зеркало на стене... –

Смежные вопросы