如何从 JSON 中的 TypedArray 中删除键

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

我正在尝试将大型类型数组从 Javascript 存储到 JSON 文件中。

对一个类型数组进行字符串化后,我使用节点的文件流系统将 JSON 字符串存储在一个新文件中。

到目前为止一切顺利,但是,当我检查新创建的文件时,我注意到该文件的大小很大。 查看文件中存储的实际文本后,我注意到在减小文件大小方面有很大的改进潜力。

这个示例结构说明了实际 JSON 字符串中数组的结构:

{“data”:[{“my_key”:“my_val1”},{“my_key”:“my_val2”},{“my_key”:“my_val3”},{“my_key”:“my_val4”},{“my_key” ": "my_val5"},{"my_key": "my_val6"},{"my_key": "my_val7"},{"my_key": "my_val8"},{"my_key": "my_val9"}]}

现在,在谷歌搜索了一下之后,我发现了这个库(json压缩)这正是我想要对我的数组做的事情。不幸的是,这个库是为 php 制作的,我尝试了其他库,例如 JSONC 以及使用某种压缩算法的其他各种库。 (LZW、DEFLATE/gzip)。

我发现所有使用某种压缩算法的库都无法为我的问题提供解决方案,因为我必须在尝试进一步压缩文件之前删除密钥。

不幸的是,每当我使用它们的函数时,像 JSONC 这样有前景的库就会让我的应用程序崩溃,而不会抛出错误、通知或其他内容

JSONC.compress()
。他们的
JSONC.pack()
函数也会崩溃,但会给出错误消息。在查看了 github 上与 JSONC 相关的问题后,我意识到这个项目可能已经死了。

现在回到我原来的问题,是否可以从数组中的每个值中删除键?如果是:最明智的方法是什么?

澄清一下,这些键不是由我创建的,也不是我的对象中存在的!我只是想对 TYPED-ARRAY 进行字符串化,但没有在最终的 JSON-STRING 中获取该数组内每个值的键。

这样的结果将是完美的,并且会极大地减小我的文件的大小:

{“数据”:{“键”:[“my_key”],“数据”:[“my_val1”,“my_val2”,“my_val3”,“my_val4”,“my_val5”,“my_val6”,“my_val7”, “my_val8”,“my_val9”]}}

javascript json node.js compression
3个回答
3
投票

您可以使用 replacer 函数作为

JSON.stringify
的第二个参数,将类型化数组转换为普通数组。无需修改或创建对象。

(k, v) => ArrayBuffer.isView(v) ? Array.from(v) : v
const myObj = {
    floats: new Float32Array([ 0.5, 3.1, -0.2, 8.0 ]),
    uints: new Uint16Array([ 259, 2 ]),
};
return JSON.stringify(myObj, (k, v) => ArrayBuffer.isView(v) ? Array.from(v) : v, /*indent*/ 2);
{
  "floats": [
    0.5,
    3.0999999046325684,
    -0.20000000298023224,
    8
  ],
  "uints": [
    259,
    2
  ]
}

2
投票

JSON.stringify 将类型化数组视为具有从 0 开始索引的对象,而不是数组。在编码之前使用 Array.from 将类型化数组转换为标准数组是可行的,例如:

var myTypedArray = new Float32Array([0.1, 323.3, 0, 2.2]);
console.log(JSON.stringify(myTypedArray)); // looks like an object
var stdArray = Array.from(myTypedArray);
console.log(JSON.stringify(stdArray)); // looks like an array

然后将 JSON 转换回类型化数组:

var json = "[0.1, 323.3, 0, 2.2]";
var myTypedArray = new Float32Array(JSON.parse(json));

0
投票

您想要的工作示例:

var dataObject = {
    "data": [{
        "my_key": "my_val1"
    }, {
        "my_key": "my_val2"
    }, {
        "my_key": "my_val3"
    }, {
        "my_key": "my_val4"
    }, {
        "my_key": "my_val5"
    }, {
        "my_key": "my_val6"
    }, {
        "my_key": "my_val7"
    }, {
        "my_key": "my_val8"
    }, {
        "my_key": "my_val 9 "
    }]
};

var newDataObject = { "data": {} };
var data = dataObject.data;

for (var i = 0; i < data.length; i++) {
    for (key in data[i]) {
        if (!newDataObject.data.hasOwnProperty(key)) {
            newDataObject.data[key] = [];
        }
        newDataObject.data[key].push(data[i][key]);
    }
}

console.log("New data object is ", JSON.stringify(newDataObject, null, 4));
© www.soinside.com 2019 - 2024. All rights reserved.