1 回答
![?](http://img1.sycdn.imooc.com/533e4c420001b2e502000200-100-100.jpg)
TA贡献1828条经验 获得超3个赞
前言:
我认为你想要做的是一种过早的微优化(https://en.wikipedia.org/wiki/Program_optimization),这是因为大多数网络服务器无论如何都会 GZip HTTP 响应,就实际而言传输的数据担心 CSV 和扩展的 JSON 表示将具有大致相同的 GZip 大小,因为它们具有相同的信息熵。
另外,我推荐阅读谷歌的这篇文章(2019 年 6 月):https : //v8.dev/blog/cost-of-javascript-2019 - 简而言之:JavaScript 很便宜,你只需要担心移动设备上的优化,不是台式机/笔记本电脑。
反正:
除了 CSV 和 JSON 对象之外,还有其他一些替代方案。
JSON 数组:
一种可能是两全其美的选择是使用 JSON 数组,如下所示:
[
[ "year","birth","101","102","103","104","105" ],
[ 1981,"Australia",5972,1099,573,747,667 ],
[ 1981,"China",141,4,3,2,2 ],
[ 1981,"India",139,5,4,6,2 ],
[ 1981,"Indonesia",371,9,14,5,6 ],
[ 1981,"Malaysia",838,72,42,11,14 ]
]
您可以使用命名const数组索引来访问每个数据成员:
const Idx = {
YEAR: 0,
BIRTH: 1,
_101: 2,
_102: 3,
_104: 4,
// etc
};
var data = JSON.parse( text ); // the array from above
for( var i = 1; i < data.length; i++ ) {
var row = data[i];
console.log( "Year: %d, Birth: %s", row[Idx.YEAR], row[Idx.BIRTH] );
}
您还可以使用自己的物化函数将每一行转换为强类型对象:
function Item( row ) {
this.year = row[Idx.YEAR];
this.birth = row[Idx.BIRTH];
}
var data = JSON.parse( text ); // the array from above
var items = data.map( row => new Item( row ) );
构造函数调用数组
将每条记录表示为父数组中的数组的另一种替代方法是将每条记录表示为构造函数调用 - 但这不起作用JSON.parse- 您必须使用eval()(不推荐)直接在服务器内的网页中呈现数据-side 生成脚本,或者让客户端将其加载到<script>元素中(这是 JSONP 的工作方式,但很危险)。
在将数据渲染到网页以供第三方数据可视化组件(如 D3 或各种其他图表库)使用时,我自己使用这种方法:
function Item( year, birth, _101, _102, _103, _104, _105 ) {
this.year = year;
this.birth = birth;
this._101 = _101;
this._102 = etc...
}
data = [
new Item( 1981,"Australia",5972,1099,573,747,667 ),
new Item( 1981,"China",141,4,3,2,2 ),
new Item( 1981,"India",139,5,4,6,2 ),
new Item( 1981,"Malaysia",838,72,42,11,14 ),
// etc
];
renderChart( data );
例如,当我需要执行数据的客户端转换并且我不想将不同格式的数据的两个副本呈现给响应时,我会使用这种方法。但正如我所说,这种技术不起作用,JSON.parse因为 json 必须只是静态数据而不是构造函数调用。
添加回答
举报