通过将布尔值转换为数组来减少 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 为 true
或 undefined
。在后一种情况下,您可以根据需要转换为布尔值。
否则利用 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 如果存在于数组
中则为真
这里是初学者。 我从 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 为 true
或 undefined
。在后一种情况下,您可以根据需要转换为布尔值。
否则利用 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 如果存在于数组