2017-02-21 82 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

非常感谢!这有帮助。 –