假设我有一个大数组,它有不同类型的数据,如 json string 和类型数组,例如mainData
var strObj = JSON.stringify({'name' : 'suman', 'age' : 29};);
var strObj2 = JSON.stringify({'name' : 'laxmi', 'age' : 29});
var tpArr = new Uint8Array(2);
tpArr[0] = 42;
tpArr[1] = 52;
var tpArr2 = new Uint8Array(2);
tpArr[0] = 32;
tpArr[1] = 52;
var mainData = [{pt : 20, recObjs : strObj}, {pt : 30, recObjs : strObj2},
{pt : 40, recObjs : tpArr}, {pt : 50, recObjs : tpArr2}];
我创建了带有数组mainData
的blob文件(类型为json)并将其导出到json文件中,如
var stringiFyData = JSON.stringify(mainData);
var myBlob = new Blob([stringiFyData], {'type': 'application/json'});
var link2 = document.getElementById('mydata');
link2.href = window.URL.createObjectURL(myBlob);
现在将文件导出为json后,我读取了类似的文件,
var fileInput = document.getElementById('fileInput');
var file = fileInput.files[0];
var reader = new FileReader();
reader.onload = function(e) {
mainData = JSON.parse(reader.result);
}
reader.readAsText(file);
现在mainData
数组,tpArr
,tpArr2
的元素从 Uint8Array 中丢失了原始类型到对象。
我需要此原始格式的tpArr
,tpArr2
数据。为此,首先我将tpArr
对象转换为数组。获取数组长度后,创建类似
newTypeArr = new Uint8Array(conNewArr.length);
for(var i=0; i<conNewArr.length; i++ ){
newTypeArr[i] = conNewArr[i];
}
但是conNewArr
数组的长度约为3000,这意味着我们必须运行循环6000,首先是3000将对象转换为数组以了解长度,然后将第二个3000转换为创建类型数组。
当然,mainData
可能有数千种数组。
其他替代
我尝试将它(new Blob(mainData, {'type': 'application/octet-stream'}
)导出到数组缓冲区中,在读取导出的文件后,我得到了所有类型数组格式的数据,但我需要这些数据,因为它是在导出之前(字符串和类型的混合)数组)。
我的问题是
window.URL = window.URL || window.webkitURL;
var myObject = {'name' : 'suman', 'age' : 29};
var myObject2 = {'name' : 'laxmi', 'age' : 29};
var strObj = JSON.stringify(myObject);
var strObj2 = JSON.stringify(myObject2);
var tpArr = new Uint8Array(5);
tpArr[0] = 42;
tpArr[1] = 52;
tpArr[2] = 62;
tpArr[3] = 22;
tpArr[4] = 42;
var tpArr2 = new Uint8Array(5);
tpArr[0] = 32;
tpArr[1] = 52;
tpArr[2] = 42;
tpArr[3] = 402;
tpArr[4] = 142;
var mainData = [
{pt : 20, recObjs : strObj},
{pt : 30, recObjs : strObj2},
{pt : 40, recObjs : tpArr},
{pt : 50, recObjs : tpArr2}
];
var stringiFyData = JSON.stringify(mainData);
var myBlob = new Blob([stringiFyData], {'type': 'application/json'});
var link2 = document.getElementById('mydata');
link2.href = window.URL.createObjectURL(myBlob);
function readFile (){
var fileInput = document.getElementById('fileInput');
var file = fileInput.files[0];
var reader = new FileReader();
reader.onload = function(e) {
data = JSON.parse(reader.result);
}
reader.readAsText(file);
}
<a href="#" id="mydata" >Download Data</a>
<input type='file' id="fileInput" accept='text/plain' onchange='readFile()'>
答案 0 :(得分:3)
为什么要导出一切都是Blob? 也许您想将所有数据导出为单个文件,并在以后再次导入。
我建议关注。
将所有Typed数组转换为Base64和JSON。
https://jsfiddle.net/esusedf7/2/
// Create a array with dummy Values
var typed_array = new Uint8Array(100000);
for (var i=0;i<100000;i++) {
typed_array[i]=i;
}
// Convert Array into Base64
var sMyBase64 = base64EncArr(typed_array);
// Convert Base64 to Array
var ori1 = base64DecToArr(sMyBase64);
// Convert Array into String (comma seperated)
var comma = bufferToString(typed_array);
// Convert String (comma seperated) into Array
var ori2 = stringToBuffer(comma);
// Compare if converted array is exactly equal to Original Array
if (typed_array.length == ori2.length) {
var match=0;
for (var i=0;i<2000;i++) {
if (typed_array[i] !== ori2[i]) {
match = 1;
}
}
if (match == 1) {
alert('ori2 Fail');
}
} else {
alert('ori2 Fail');
}
原始阵列:100000
Base64字符串:136844百分比增加137%
逗号字符串:356989百分比增加357%
Json字符串:1145881百分比增加1146%