Node.js中的快速数组分块

时间:2018-10-11 00:56:09

标签: javascript arrays node.js chunks array-splice

我正在处理长数据集中的数组分块。我需要创建一个新的一定大小的块数组。当前,我使用此解决方案,但它显示出不良的性能。

function array_to_chunks(data, size){
   let chunks = []
   let d = data.slice()
   while (d.length >= size) chunks.push(d.splice(0, size))
   return chunks
}

我想找到一个更好的主意,即如何足够快地执行它以及为什么我的代码不能很好地执行。

3 个答案:

答案 0 :(得分:2)

由于您不必复制数组,因此性能更高一些

const createGroupedArray = function (arr, chunkSize) {

    if (!Number.isInteger(chunkSize)) {
        throw 'Chunk size must be an integer.';
    }

    if (chunkSize < 1) {
        throw 'Chunk size must be greater than 0.';
    }

    const groups = [];
    let i = 0;
    while (i < arr.length) {
        groups.push(arr.slice(i, i += chunkSize));
    }
    return groups;
};

如果要执行I / O,请使用Node.js流:

const strm = new Writable({
  write(chunk, enc, cb){
     // do whatever
  }
});

答案 1 :(得分:0)

我很想听听您对这种方法的看法:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
const size = 5

const chunkIt = (arr, size) => {
  let buckets = []

  // Just create the buckets/chunks storage
  for (let i = 1; i <= Math.ceil(arr.length / size); i++) {
    buckets.push([])
  }

  // Put in the buckets/storage by index access only
  for (let i = 0; i < arr.length; i++) {
    var arrIndex = Math.ceil((i + 1) / size) - 1
    buckets[arrIndex].push(arr[i])
  }

  return buckets;
}

console.log(chunkIt(arr, size))

我做了一些基本的JS基准测试,并且做得很好。想法是预先创建存储桶,因为该操作应该不会那么昂贵,然后只需按索引即可。

答案 2 :(得分:-1)

您可以使用lodash chunk方法,这可以满足您的需求

const _ = require('lodash');
_.chunk([1,2,3,4,5,6],2);