假设我有一个大数组,它有不同类型的数据,如 json string 和 typed array,如 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'}
) 到数组缓冲区中,在读取导出文件后,我得到了所有数据类型化数组格式,但我需要导出前的这些数据(字符串和类型化数组的混合)。
我的问题是
- 我们如何在 blob 文件中导出字符串和类型数组的混合数据,并从 blob/文件中检索这些数据而不丢失其原始形式(类型)?
- 我的方法可以吗?
- 我们如何才能在我的方法中减少如此大循环的迭代?
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()'>
最佳答案
为什么要export everything is 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%
关于javascript - 将大数组(字符串和类型化数组的混合)存储/检索到 blob 或文件中/从中检索的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29442824/