问题描述
我尝试构建一个JSON对象,该对象最终将保存到文件中。但是我发现如果使用接近“ element + = element”的方法,它将抛出“ Invalid string length”字符串。但是对于方法2,我可以连接一个很长的String并保存一个文件。 (文件约为50mb)。所以我想知道我的第一种方法有什么问题吗?
const person = {
id: 1,name: "john"
}
personjson = JSON.stringify(person);
personjson = personjson + ',';
let element = personjson;
for (let index = 0; index < 500; index++) {
element += element;
}
let element = personjson;
for (let index = 0; index < 100000; index++) {
element = element + personjson;
}
解决方法
在两种方法中,您都会产生不同的结果,即
假设personJson
包含字符串"ab"
-
element = element + element;
正在产生结果"ab" + "ab" "abab" + "abab" "abababab" + "abababab"
,依此类推... 这就是字符串长度呈指数增长的原因。
-
element = element + personJson;
"ab" + "ab" "abab" + "ab" "abababab" + "ab"
,依此类推... 这会使您的字符串长度线性增长。
为更好地理解,请运行以下代码并查看结果:
const person = {
id: 1,name: "john"
}
personJson = JSON.stringify(person);
personJson = personJson + ',';
let element = personJson;
for (let index = 0; index < 500; index++) {
element += element;
console.log(element.length);
}
,
正如评论中指出的那样,这可能不是编码JSON的最佳方法。
关于发生这种情况的原因,这是因为您的第一个循环实际上是每次迭代将大小乘以2,因此它呈指数增长。它很快就达到了远远超过第二个循环的大小,最终超过了javascript engine允许的字符串最大大小。
index = 0 ; length = 23
index = 1 ; length = 46
index = 2 ; length = 92
...
index = 24 ; length = 385875968
index = 25 ; length = 771751936
,
您可以创建要添加到该对象的对象数组。喜欢:
const persons= [] ;
persons.push({id:1,name: 'Shayan' });
persons.push({id:2,name: 'john' });
...