数组的位/字节大小计数

21

我在Javascript中有一个包含许多子数组的数组。如何最好/最简单地计算数组所占用的位数/字节数?我将发送该数组到我的PHP服务器,它只能达到5kB。

是否有本地方法可以实现此功能?我不太熟悉位。如果我理解正确,1个字符适合8b / 1B(尽管这显然取决于编码)。最好的方法是循环遍历所有数组并计算字符数吗?


看一下这个链接 https://dev59.com/Q3M_5IYBdhLWcg3wvV5w#11900218 看起来更准确。 - Zvi Redler
3个回答

20

你可以这样做:(为了获得真正好的估计)

var g = JSON.stringify(myBigNestedarray).replace(/[\[\]\,\"]/g,''); //stringify and remove all "stringification" extra data
alert(g.length); //this will be your length.
例如:看这个嵌套数组:
var g=[1,2,3,['a','b',['-','+','&'],5],['שלום','יגבר']] JSON.stringify(g).replace(/[\[\]\,\"]/g,'')
 "123ab-+&5שלוםיגבר"

它的长度为:17(字节)

这种方式-您可以利用json.parse的好处,它会完成大部分工作,然后再删除额外的数组保持者。


2
喜欢'שלוםיגבר'。 - OhadR

11

首先,您需要将数组转换为用于向服务器传输数据的字符串表示形式。数组的大小并不重要,因为将传输该字符串。取决于您如何序列化该数组,大小差异可能非常显着。

可能的选项是使用jQuery.param()方法或JSON.stringify()。您还可以构建自己的方法来转换值,以便您的PHP代码可以理解它。

在获取该字符串后,您需要使用stringValue.length * 8来获得大小,假设a) 值是ASCII或b) 您对所有值进行了URL编码,以便Unicode字符转换成ASCII码。*8在这里是为了获取位数,但由于您提到限制是5kB,因此这些最有可能是字节,因此您可以跳过乘法。


1
引用 jQuery.param 文档: "注意: 由于没有普遍认可的 param 字符串规范,因此不可能使用此方法以一种在支持此类输入的所有语言中都能理想地工作的方式对复杂数据结构进行编码。请改用 JSON 格式作为编码复杂数据的替代方法。" - Prinzhorn
该操作想知道数组容纳了多少字节。您的解决方案没有考虑到表示数组[]"等的额外字符...因此根据您的解决方案,[1]的长度为3,这是不正确的(它的长度为1)。 - Royi Namir
@RoyiNamir 他说的是这个,但我不认为他的意思是这个。如果他只能向服务器传输5kB,则序列化数据的长度很重要。而 [1] 的长度为8,因为JavaScript将 1 存储为64位IEEE 754浮点数。你看,他的问题是含糊不清的。 - Prinzhorn
@Prinzhorn 我读到了:“数组占用多少字节。” 这就是我的答案。 :-) - Royi Namir
@RoyiNamir 我看到你说:“我将把数组发送到我的 PHP 服务器”,这就是我的回答。:-)。但是,不要再谈这个了;)。 - Prinzhorn

4
您可以使用Blob在将其转换为字符串时获取数组的字节大小。

示例:

const myArray = [{test: 1234, foo: false, bar: true}];

console.info(new Blob([JSON.stringify(myArray)]).size); // 38


3
注意使用此方法,我认为它用于单次使用相当优雅,但是当我试图用它来“测量”我用作快速传入WebSocket数据缓冲区的数组的大小时,我遇到了巨大的内存泄漏问题(每5秒钟测量一次随着数据的增长)...它使内存使用从一开始的25MB在几分钟内完全飙升到1GB...非常奇怪。 - exside
@exside 为什么?我的意思是你有没有想法为什么会发生这些泄漏事件?你确定它们是由于这个原因吗? - aderchox
@aderchox 其实不完全是这样,如果有人知道的话,我很想了解一些见解。 我基本上打算对传入数据的数据缓冲区进行一些监视/统计(例如,查看我的缓冲区大小是否足够大或者是否会溢出,因为数据并不总是以相同的速率进入,但后来我注意到了这个内存占用问题(甚至不确定我们是否可以称其为“泄漏”)... - exside

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接