猿问

通过将布尔值转换为数组来减少 JSON 大小是个好主意吗?

初学者在这里。我从我的 API 调用中得到以下信息:


"formatting": {

  "isBold": false,

  "isItalic": false,

  "isUnderlined": false,

  "isFirstWordOfSentence": false

  ... and so on.

},

现在发送这么多数据似乎相当昂贵。我们可能会遇到这样一种情况,即 10 项中只有一项实际设置为 true,但我们仍然需要发送所有 10 项。我想知道我是否可以用不同的方式构建它,这样可以节省发送这么多数据,但仍然保留相同数量的信息。


我正在考虑像这样将数据存储在数组中:


"formatting": ['isBold', 'isFirstWordofSentence']

然后在前端,而不是检查我是否isBold会true做一个formatting.indexOf('isBold') !== -1. 我知道缺点是现在代码不再那么清晰了,但我想知道它是否可行?


它肯定会减少我的 JSON 的大小。同时我不确定indexOf前端的调用最终是否会比简单的布尔检查更昂贵?在那种情况下,我总是可以在获取之后进行规范化。


任何建议或意见将不胜感激。请记住我是初学者。


波斯汪
浏览 136回答 4
4回答

慕哥6287543

您可能会考虑避免 API 响应中的错误值"formatting": {  "isUnderlined": true,  "isItalic": false}"formatting": {  "isUnderlined": true}两种情况下的条件搜索返回相同的结果如果您最终将响应转换为数组, formatting.indexOf('isUnderlined')并且formatting.includes('isUnderlined')如果存在于数组中则返回 true

UYOU

与数据发送/解析的任何问题一样,这里有很多事情需要考虑。我倾向于不进行您在这里考虑的那种优化,除非您正在处理大量数据 [同时处理数百万/数十亿行]。您也不需要!== -1在.indexOf(). 只需检查真实性即可。另一位用户还提到 JS 数组有.includes(). 话虽这么说,这将对列表进行顺序扫描,并且字典查找速度更快。这肯定会减慢处理数据的速度,而不是加快发送数据的速度。

弑天下

您可以使用Array#includeswhich 返回布尔结果。formatting.includes('isBold')一种更短的方法是只存储true值。这允许直接使用该属性而无需迭代数组。formatting: {     isBold: true     }访问与具有 的属性相同false,但访问返回true或undefined。在后一种情况下,您可以根据需要转换为布尔值。否则,通过在语句或其他依赖检查中使用truthy / falsy值,利用 Javascript 自动强制转换为布尔值的优势if,例如条件(三元)运算符?:

一只萌萌小番薯

前言:在大多数情况下,JSON 大小与成本无关。如果您希望减少延迟,请查看 websockets。答案:为了减小尺寸,您可以使用一些假设:如果未找到该值,则假设它是假的。发送一个 JSON{  formatting: ['isBold', 'isItalic']}相当于{  formatting: {    isBold: true,    isItalic: true,    isUnderlined: false,    isFirstWordOfSentence: false  }}然后,您可以使用检查值Array.prototype.includesconst isBoldTrue = data.formatting.includes('isBold')
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答