2017-05-05 64 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