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

标签 javascript arrays json typed-arrays

假设我有一个大数组,它有不同类型的数据,如 json stringtyped 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 数组、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 文件中导出字符串和类型数组的混合数据,并从 blob/文件中检索这些数据而不丢失其原始形式(类型)?
  2. 我的方法可以吗?
  3. 我们如何才能在我的方法中减少如此大循环的迭代?

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/

相关文章:

javascript - 如何在同一区域延迟加载图像以使其看起来像动画?

javascript - 抛出字符串而不是错误

javascript - Angular JS 和 Spring - 如何过滤 JSON 对象

javascript - PHP 将变量返回给 AJAX(也许是一个数组?)

javascript - 创建正则表达式 Javascript 数组

javascript - 如何在发布请求的键的变量内发送值

javascript - 如果浏览器窗口处于特定宽度,如何使 div 不显示?

javascript - 声云流媒体 IE8

javascript - 在javascript中将字符串数组转换为数组

objective-c - 在 Objective-C 的对象数组中访问对象及其属性