首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将数组拆分为块

将数组拆分为块
EN

Stack Overflow用户
提问于 2011-12-14 04:24:42
回答 26查看 811.7K关注 0票数 736

假设我有一个Javascript数组,如下所示:

代码语言:javascript
复制
["Element 1","Element 2","Element 3",...]; // with close to a hundred elements.

什么方法适合将数组分块(拆分)成许多较小的数组,比如说,最多10个元素?

EN

回答 26

Stack Overflow用户

发布于 2012-05-05 05:57:16

根据dbaseman的答案进行修改:

https://stackoverflow.com/a/10456344/711085

代码语言:javascript
复制
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]]

次要附录

我应该指出,使用上面的方法(在我看来)并不是很优雅。

..。它基本上执行以下操作,其中~是连接:

代码语言:javascript
复制
[[1,2,3]]~[]~[]~[] ~ [[4,5,6]]~[]~[]~[] ~ [[7]]

它与下面的方法具有相同的渐近运行时间,但由于构建空列表,可能会有更糟糕的恒定因子。可以按如下方式重写(主要与Blazemonger的方法相同,这就是我最初没有提交此答案的原因):

更高效的方法:

代码语言:javascript
复制
// 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)
)

我现在更喜欢的方式是上面的,或者是下面的其中一种:

代码语言:javascript
复制
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));

  }
});

演示:

代码语言:javascript
复制
> JSON.stringify( Array.range(10).chunk(3) );
[[1,2,3],[4,5,6],[7,8,9],[10]]

或者,如果你不想要一个Array.range函数,它实际上只是一行代码(不包括fluff):

代码语言:javascript
复制
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));
}});

或者

代码语言:javascript
复制
Object.defineProperty(Array.prototype, 'chunk', {value: function(n) {
    return Array.from(Array(ceil(this.length/n)), (_,i)=>this.slice(i*n,i*n+n));
}});
票数 165
EN

Stack Overflow用户

发布于 2012-08-02 01:07:51

尽量避免使用原生原型,包括

,如果你不知道谁会使用你的代码(第三方,同事,以后你自己,等等)。

有一些方法可以安全地扩展原型(但不是在所有浏览器中),也有一些方法可以安全地使用从扩展的原型创建的对象,但更好的经验法则是遵循

最小惊喜原则

并完全避免这些做法。

如果你有时间,可以看看安德鲁·杜邦的JSConf 2011演讲,

“一切都是允许的:扩展内置组件”

,对这个话题进行了很好的讨论。

但回到问题上来,虽然上面的解决方案可以工作,但它们过于复杂,需要不必要的计算开销。以下是我的解决方案:

代码语言:javascript
复制
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;
票数 130
EN

Stack Overflow用户

发布于 2014-07-16 21:24:28

我在jsperf.com中测试了不同的答案。结果可以在这里找到:

https://web.archive.org/web/20150909134228/https://jsperf.com/chunk-mtds

最快的函数(在IE8中运行)是这样的:

代码语言:javascript
复制
function chunk(arr, chunkSize) {
  if (chunkSize <= 0) throw "Invalid chunk size";
  var R = [];
  for (var i=0,len=arr.length; i
票数 81
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8495687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档