我有一个 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 中按内存大小对对象数组进行分块的最佳方法是什么?
如果需要根据对象的字节大小将对象数组拆分为更小的块,可以在将对象转换为 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 字符串后的字节大小。