如何在 JavaScript 中根据每个块的最大内存大小(以字节为单位)将对象数组拆分为块?

问题描述 投票:0回答:1

我有一个 JavaScript 对象数组,我需要将此数组拆分为更小的块,其中每个块的总大小不超过指定的字节限制。

每个对象可以有不同的大小,我想使用每个对象的字节大小(在对其进行字符串化之后)作为分块的基础。我正在使用 Node.js,并希望使用 Buffer.byteLength 确保正确计算大小。

如何在 JavaScript 中实现此目的?

这是我想做的一个例子:

const data = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  // potentially many more objects
];

const maxSizeInBytes = 100; // Example size limit for each chunk

在 JavaScript 中按内存大小对对象数组进行分块的最佳方法是什么?

javascript arrays
1个回答
0
投票

如果需要根据对象的字节大小将对象数组拆分为更小的块,可以在将对象转换为 JSON 字符串后使用 Buffer.byteLength 计算每个对象的字节大小来实现此目的。

这里有一个函数,可以将数组分割成更小的数组,确保每个块中对象的总大小不超过指定的大小限制:

function chunkByBytes<T>(arr: T[], size: number): T[][] {
  const chunks = [];
  let chunkSize = 0;
  let chunk = [];
  for (let index = 0; index < arr.length; index++) {
    const item = arr[index];
    const itemSize = Buffer.byteLength(JSON.stringify(item)); // Get byte size of the item
    
    // If adding this item exceeds the max size, start a new chunk
    if (chunkSize + itemSize > size) {
      chunks.push(chunk);
      chunkSize = 0;
      chunk = [];
    }
    
    // Add the item to the current chunk
    chunk.push(item);
    chunkSize += itemSize;
  }

  // Add the last chunk if not empty
  if (chunk.length > 0) {
    chunks.push(chunk);
  }

  return chunks;
}

const data = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 3, name: 'Charlie' }
];
// usage
const maxSizeInBytes = 50;
const result = chunkByBytes(data, maxSizeInBytes);

console.log(result);


对于每个对象,我们使用

Buffer.byteLength(JSON.stringify(item))
计算字节大小。这给出了对象被序列化为 JSON 字符串后的字节大小。

© www.soinside.com 2019 - 2024. All rights reserved.