2017-02-21 83 views
0

我的例子:切片陣列到多個份

let arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]; 
 

 
let slice = (source, index) => source.slice(index, index + 4); 
 

 
let length = arr.length; 
 

 
let index = 0; 
 

 
let result = []; 
 

 
while (index < length) { 
 
    let temp = slice(arr, index); 
 
    
 
    result.push(temp); 
 
    
 
    index += 4; 
 
} 
 

 
console.log(result);

日誌記錄:

[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18]]

欲切片陣列到多個份每4項[1,2,3,4] [5,6,7,8]...

代碼工作正常。

我有2個問題:

1 /。是否有另一種方法通過使用內聯代碼來實現這一點?例如:result = arr.slice(...)

2 /。之後我定義:

let push = result.push; 

爲什麼不能我仍然可以使用:

push(temp) 

錯誤消息:

Uncaught TypeError: Array.prototype.push called on null or undefined

更新:我已經更新基於答案的解決方案。希望它有幫助。

let arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]; 
 

 
let result = []; 
 

 
arr.forEach((x,y,z) => !(y % 4) ? result.push(z.slice(y, y + 4)) : ''); 
 

 
console.log(result);

記錄:

[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18]]

+3

'let push = result.push;'提取函數,使其不再與任何特定對象關聯。你需要使用'push.call(result,temp)' – 4castle

回答

1

一個簡單的方法來做到這一點

var chunckArray = function(array, chunkCount){ 
    var chunks = []; 
    while(array.length){ 
     chunks.push(array.splice(0, chunkCount); 
    } 
    return chunks; 
} 

非consumative方式:

var chunckArray = function(array, chunkCount){ 
    var chunks = [], i, j; 
    for (i = 0, j = array.length; i<j; i+= chunkCount) { 
     chunks.push(array.slice(i, i + chunkCount); 
    } 
    return chunks; 
} 
+0

這將是值得淺克隆它,以保持所需的行爲,而不是改變原來 –

+0

你是對的夥伴 –

+0

非常感謝!這有幫助。 –

1

我這個做用一個簡單的減少(見plnkr):

let arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]; 

var counter = -1; 
var result = arr.reduce((final, curr, i) => { 
    if (i % 4 === 0) { 
    final.push([curr]) 
    counter++; 
    } else { 
    final[counter].push(curr); 
    } 

    return final; 
}, []); 

console.log(result); 

你可以調整4和具有可變chuckSize替代它,這將讓你可以重新申請其他的東西 - 你也可以在功能與paramerters (array, chunkSize)把這個包,如果你想

+0

非常感謝!這有幫助。 –

1

你也可以做它用一個for循環,這將給你一個相同的結果:

let arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]; 

console.log(arr.length); 
var result=[]; 

for(var i = 0; i < arr.length; i+=4) { 
    result=arr.slice(i, i+4); 
    console.log(result); 
} 
+1

非常感謝!這有幫助。 –