在blob或文件中存储/检索大数组(字符串和类型化数组的混合)的最佳方法

时间:2015-04-04 04:48:50

标签: javascript arrays json typed-arrays

假设我有一个大数组,它有不同类型的数据,如 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数组,tpArrtpArr2的元素从 Uint8Array 中丢失了原始类型到对象

我需要此原始格式的tpArrtpArr2数据。为此,首先我将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'})导出到数组缓冲区中,在读取导出的文件后,我得到了所有类型数组格式的数据,但我需要这些数据,因为它是在导出之前(字符串和类型的混合)数组)。

我的问题是

  1. 我们如何在blob文件中导出字符串和类型数组的mixtutre数据,并从blob / file中检索这些数据而不丢失它的原始形式(类型)?
  2. 我的方法好吗?
  3. 如何在我的方法中减少这种大循环的迭代?
  4. 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()'>

1 个答案:

答案 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%