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

问题描述

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

"formatting": {
  "isBold": false,"isItalic": false,"isUnderlined": false,"isFirstWordOfSentence": false
  ... and so on.
},

现在,发送大量数据似乎非常昂贵。我们可能会遇到这样一种情况,即实际上只有十分之九的项目被设置为true,但是我们仍然需要发送所有十项。我想知道是否可以以其他方式构造这种结构,这样可以节省发送大量数据的时间,但仍保留相同数量的信息。

我当时想像这样将数据存储在数组中

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

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

这肯定会减小我的JSON的大小。同时,我不确定前端的indexOf调用是否会比简单的布尔检查昂贵呢?在那种情况下,我总是可以在获取后进行归一化。

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

解决方法

您可能会考虑避免API响应中的错误值

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

"formatting": {
  "isUnderlined": true
}

两种情况下的条件搜索均返回相同的结果

如果您最终将响应转换为数组, 如果formatting.indexOf('isUnderlined')formatting.includes('isUnderlined')出现在数组中,则返回true

,

您可以使用Array#includes来返回布尔结果。

formatting.includes('isBold')

一种更短的方法是仅存储true值。这样一来,无需迭代数组即可直接使用该属性。

formatting: {
    isBold: true
}

访问权限与false的属性相同,但是访问权限返回trueundefined。在后一种情况下,如有必要,您可以转换为布尔值。

否则,可以通过在if语句中使用truthy / falsy值或其他相关检查来利用Javascript自动强制转换为布尔值的优势,例如使用conditional (ternary) operator ?:

,

与数据发送/解析的任何问题一样,这里有很多事情要考虑。

除非您要处理大量数据(同时处理数百万/数十亿行),否则我不打算在此处进行这种优化。

您也不需要在var json = "[ { \"Name\":\"Amal\",\"Country\":\"India\" },{ \"Name\":\"Luke\",\"Country\":\"England\" },{ \"Name\":\"Tom\",\"Country\":\"Australia\" },{ \"Name\":\"Ram\",{ \"Name\":\"Jane\",\"Country\":\"France\" }]"; var arr = JArray.Parse(json); var result = new JArray( arr.Where(r=> r.Value<string>("Name").EndsWith("e"))); 上运行!== -1。只需检查真实性即可。另一个用户还提到JS数组具有.indexOf()。话虽如此,这将对列表进行顺序扫描,并且字典查找更快。当然,这将减慢正在处理数据的速度,而不是加快数据发送速度。

,

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

answer:为减小尺寸,您可以使用一些假设:如果找不到该值,则假定它为假。

发送JSON

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

将等同于

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

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

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