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

Reduce JSON-size by turning booleans into an array a good idea?

这里是初学者。 我从 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 调用最终是否会比简单的布尔检查更昂贵?在那种情况下,我总是可以在获取后正常化。

如有任何建议或建议,我们将不胜感激。请记住我是初学者

您可以使用 Array#includes 其中 returns 布尔结果。

formatting.includes('isBold')

一种更短的方法是仅存储 true 个值。这允许直接使用 属性 而无需迭代数组。

formatting: {
    isBold: true
}

访问权限与具有 false 的属性相同,但访问权限 returns 为 trueundefined。在后一种情况下,您可以根据需要转换为布尔值。

否则利用 Javascript 的自动强制转换为布尔值的优势,使用 truthy/falsy values in if statements or other depending checks, like with a conditional (ternary) operator ?:

与任何数据问题一样sending/parsing,这里有很多事情需要考虑。

我倾向于不进行您在这里考虑的那种优化,除非您同时处理大量数据 [millions/billions 行]。

您也不需要 运行 !== -1 .indexOf()。只需检查真实性即可。另一位用户还提到 JS 数组有 .includes()。也就是说,这将 运行 顺序扫描列表,并且字典查找速度更快。这肯定会减慢处理数据的速度,而不是加快发送数据的速度。

前言:在大多数情况下JSON大小与成本无关。如果您希望减少延迟,请查看 websockets。

回答:为了减小尺寸,您可以使用一些假设:如果找不到该值,则假设它是假的。

发送 JSON 个

{
  formatting: ['isBold', 'isItalic']
}

相当于

{
  formatting: {
    isBold: true,
    isItalic: true,
    isUnderlined: false,
    isFirstWordOfSentence: false
  }
}

然后,您可以使用 Array.prototype.includes

检查该值
const isBoldTrue = data.formatting.includes('isBold')

您可以考虑避免在 API 响应中使用错误值

"formatting": {
  "isUnderlined": true,
  "isItalic": false
}

"formatting": {
  "isUnderlined": true
}

两种场景的条件搜索return相同

如果您最终将响应转换为数组, formatting.indexOf('isUnderlined')formatting.includes('isUnderlined') return 如果存在于数组

中则为真