问题描述
"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
的属性相同,但是访问权限返回true
或undefined
。在后一种情况下,如有必要,您可以转换为布尔值。
否则,可以通过在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')