假设我有一个Javascript数组,如下所示:
["Element 1","Element 2","Element 3",...]; // with close to a hundred elements.
什么方法适合将数组分块(拆分)成许多较小的数组,比如说,最多10个元素?
发布于 2012-05-05 05:57:16
根据dbaseman的答案进行修改:
https://stackoverflow.com/a/10456344/711085
Object.defineProperty(Array.prototype, 'chunk_inefficient', {
value: function(chunkSize) {
var array = this;
return [].concat.apply([],
array.map(function(elem, i) {
return i % chunkSize ? [] : [array.slice(i, i + chunkSize)];
})
);
}
});
console.log(
[1, 2, 3, 4, 5, 6, 7].chunk_inefficient(3)
)
// [[1, 2, 3], [4, 5, 6], [7]]
次要附录
我应该指出,使用上面的方法(在我看来)并不是很优雅。
..。它基本上执行以下操作,其中~是连接:
[[1,2,3]]~[]~[]~[] ~ [[4,5,6]]~[]~[]~[] ~ [[7]]
它与下面的方法具有相同的渐近运行时间,但由于构建空列表,可能会有更糟糕的恒定因子。可以按如下方式重写(主要与Blazemonger的方法相同,这就是我最初没有提交此答案的原因):
更高效的方法:
// refresh page if experimenting and you already defined Array.prototype.chunk
Object.defineProperty(Array.prototype, 'chunk', {
value: function(chunkSize) {
var R = [];
for (var i = 0; i < this.length; i += chunkSize)
R.push(this.slice(i, i + chunkSize));
return R;
}
});
console.log(
[1, 2, 3, 4, 5, 6, 7].chunk(3)
)
我现在更喜欢的方式是上面的,或者是下面的其中一种:
Array.range = function(n) {
// Array.range(5) --> [0,1,2,3,4]
return Array.apply(null,Array(n)).map((x,i) => i)
};
Object.defineProperty(Array.prototype, 'chunk', {
value: function(n) {
// ACTUAL CODE FOR CHUNKING ARRAY:
return Array.range(Math.ceil(this.length/n)).map((x,i) => this.slice(i*n,i*n+n));
}
});
演示:
> JSON.stringify( Array.range(10).chunk(3) );
[[1,2,3],[4,5,6],[7,8,9],[10]]
或者,如果你不想要一个Array.range函数,它实际上只是一行代码(不包括fluff):
var ceil = Math.ceil;
Object.defineProperty(Array.prototype, 'chunk', {value: function(n) {
return Array(ceil(this.length/n)).fill().map((_,i) => this.slice(i*n,i*n+n));
}});
或者
Object.defineProperty(Array.prototype, 'chunk', {value: function(n) {
return Array.from(Array(ceil(this.length/n)), (_,i)=>this.slice(i*n,i*n+n));
}});
发布于 2012-08-02 01:07:51
尽量避免使用原生原型,包括
,如果你不知道谁会使用你的代码(第三方,同事,以后你自己,等等)。
有一些方法可以安全地扩展原型(但不是在所有浏览器中),也有一些方法可以安全地使用从扩展的原型创建的对象,但更好的经验法则是遵循
最小惊喜原则
并完全避免这些做法。
如果你有时间,可以看看安德鲁·杜邦的JSConf 2011演讲,
“一切都是允许的:扩展内置组件”
,对这个话题进行了很好的讨论。
但回到问题上来,虽然上面的解决方案可以工作,但它们过于复杂,需要不必要的计算开销。以下是我的解决方案:
function chunk (arr, len) {
var chunks = [],
i = 0,
n = arr.length;
while (i < n) {
chunks.push(arr.slice(i, i += len));
}
return chunks;
}
// Optionally, you can do the following to avoid cluttering the global namespace:
Array.chunk = chunk;
发布于 2014-07-16 21:24:28
我在jsperf.com中测试了不同的答案。结果可以在这里找到:
https://web.archive.org/web/20150909134228/https://jsperf.com/chunk-mtds
最快的函数(在IE8中运行)是这样的:
function chunk(arr, chunkSize) {
if (chunkSize <= 0) throw "Invalid chunk size";
var R = [];
for (var i=0,len=arr.length; i
https://stackoverflow.com/questions/8495687
复制相似问题