Javascript如何作为url参数(angular js)很好地传递位数组

时间:2014-01-08 11:34:56

标签: javascript arrays angularjs bit-manipulation url-parameters

从编码的角度来看,我正在寻找在小型javascript应用程序中将位数组作为url参数传递的方法,并且我希望保持参数长度尽可能小。我知道如何解决它,但对于一个对我来说似乎很常见的问题,这似乎相当复杂。

上下文如下:我正在尝试使用angularjs并编写了一个有点像购物车/配置器的简单应用程序。我有相当少数量的对象(> 1024),每个对象都有少量配置选项(少于6个)。使用该应用程序的人可能会在典型场景中选择约20个这些对象,并使用该工具进行配置。我想让这个配置'可收起书'。 App将此配置存储为数组。

我猜这个数组可以jsonify并将其作为url参数传递,但这将是非常长的。如上所述 - 我需要的每个对象都是2个字节(对象ID为10位,其配置为6位)。编写将配置数组转换为位数组的函数应该不难。如果我没有把我的错误限制在javascript中的32位整数,但这也不应该太麻烦。最终我可以将该bitarray转换为整数版本并将其用作url参数,但这仍然是一个相当长的参数,我的猜测是,如果我不仅在url参数中使用数字,我可以缩短它,但是以及信件。

由于这个问题对我来说或多或少听起来像一个相当普遍的问题,如果你能给我片段或提示我可以解决问题,我会很高兴。如果有比我的想法更有效的方法来使用一个很好的位阵列数组。我只是想避免创建一个非常笨拙的解决方案,如果应该有一个优雅的最佳实践版本可以这么说。重点是让javascript / angularjs更加熟悉。

干杯

3 个答案:

答案 0 :(得分:0)

您可以尝试将数字转换为十六进制:

> [2,10,20,30,245].map(function(x) { return (x < 16 ? "0" : "") + x.toString(16) }).join("")
"020a141ef5"

反之亦然:

> "020a141ef5".match(/../g).map(function(x) { return parseInt(x, 16) })
[2, 10, 20, 30, 245]

这不是最紧凑的编码,但最容易实现。

答案 1 :(得分:0)

  

我的对象数量相当少,每个对象都有少量的配置选项......

对我来说,这个模型太复杂了,无法将所有这些放在URL栏上。

我会创建一些Json对象,将其存储到具有唯一ID的缓存/ localStorage中,并仅传入URL ID。

在接收方,按照您通过URL传递的ID提取所有存储的数据。

通过这种方式,在发生故障时,t将很容易维护代码和调试。

答案 2 :(得分:0)

当将字节表示为字母时,无论如何您可能需要percent encoding。但是,您可以在之前使用String.fromCharCode

> encodeURIComponent(String.fromCharCode.apply(String, [2, 10, 20, 30, 245]))
%02%0A%14%1E%C3%B5