2017-05-05 24 views
0

我目前正试图从JavaScript大,类型化数组存储到JSON档案删除键。使用Javascript - 从TypedArray在JSON

字符串化一个输入阵列后,我使用存储节点的文件流系统在一个新的文件JSON字符串。

到目前为止好,但是,一旦我检查了新创建的文件,我注意到,这个文件的大小是巨大的。 通过查看存储在文件中的实际文本,我发现在减少文件大小方面有相当多的改进潜力。

这exemplaric结构示出了在实际JSON串阵列的结构:

{ “数据”:[{ “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”}]}现在

,张望了一下googeling后,我发现this libary (json-compressed)这正是我想用我的阵列做。不幸的是,这个库是为PHP编写的,我尝试了其他库,如JSONC和其他各种使用某种压缩算法的库。 (LZW,DEFLATE/gzip)。

我发现,使用某种压缩算法的所有libaries不能为我的问题提供解决方案,因为我有试图进一步压缩文件之前删除键。

不幸的是,看好libaries像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”]}}


预先感谢任何有用的输入!

最好的问候。

+0

你就不能组此列表按键?我的意思是,类似于:{data:{my_key:[my_val1,my_val2,...]}} – raina77ow

+0

这就是我的问题,我怎么能够做到这一点?^^ – mxl

+2

相关:http:// stackoverflow .com/questions/14446511 /什么是最有效的方法对一个对象的数组的对象 – raina77ow

回答

0

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

感谢您的快速回复!不幸的是,这不是我的问题的正确表示。正如我在我最初的问题中提到的,一旦我的对象中的typedArray正在被字符串化,键就由JSON创建。 – mxl

+0

没有它没有。导致我的问题的数据是我试图存储的JS obj内部的Float32Array。这个类型化的(Float32)数组一旦被字符串化(并且只有在它被字符串化时)才会被JSON自动地装配到键(数值位于实际数组中;从0-N)。 – mxl

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array – mxl

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)); 
+0

感谢您的快速回复!不幸的是,这不是我的问题的正确表示。正如我在我最初的问题中提到的,一旦我的对象中的typedArray正在被字符串化,键就由JSON创建。 – mxl