hyparquet/src/utils.js

40 lines
1.1 KiB
JavaScript
Raw Normal View History

2024-01-05 09:39:59 +00:00
/**
* Replace bigints with numbers.
* When parsing parquet files, bigints are used to represent 64-bit integers.
* However, JSON does not support bigints, so it's helpful to convert to numbers.
*
* @param {any} obj object to convert
* @returns {unknown} converted object
*/
export function toJson(obj) {
2024-02-14 05:11:34 +00:00
if (obj === undefined) return null
if (typeof obj === 'bigint') return Number(obj)
if (Array.isArray(obj)) return obj.map(toJson)
2024-05-04 07:38:19 +00:00
if (obj instanceof Uint8Array) return Array.from(obj)
2024-05-13 01:12:30 +00:00
if (obj instanceof Date) return obj.toISOString()
2024-02-14 05:11:34 +00:00
if (obj instanceof Object) {
2024-01-05 09:39:59 +00:00
/** @type {Record<string, unknown>} */
const newObj = {}
for (const key of Object.keys(obj)) {
2024-02-14 05:25:40 +00:00
if (obj[key] === undefined) continue
2024-01-05 09:39:59 +00:00
newObj[key] = toJson(obj[key])
}
return newObj
}
2024-02-14 05:11:34 +00:00
return obj
2024-01-05 09:39:59 +00:00
}
2024-04-07 16:33:57 +00:00
/**
* Concatenate two arrays fast.
2024-05-02 06:23:50 +00:00
*
* @typedef {import('./types.js').DecodedArray} DecodedArray
2024-04-07 16:33:57 +00:00
* @param {any[]} aaa first array
2024-05-02 06:23:50 +00:00
* @param {DecodedArray} bbb second array
2024-04-07 16:33:57 +00:00
*/
export function concat(aaa, bbb) {
const chunk = 10000
for (let i = 0; i < bbb.length; i += chunk) {
aaa.push(...bbb.slice(i, i + chunk))
}
}