数组长度小于 – json中的空开销

我正在写一个简单的游戏。 它基于一个32×32的方块。 每个方块都可以包含一个游戏元素。 当一个元素出现/移动/变化时,服务器通过websockets向所有客户端发送一个json对象,该json对象包含一个类似于整个游戏场的二维数组。

发送到多个客户端时,这是相当多的数据,每秒多次。

所以我想知道如何减less这个。

我认为这将有助于从客户端已经收到的大arrays中删除一切。 但是,如果你有这样的事情:

var gameField = []; gameField[6][10] = "player1"; console.log(JSON.stringify(gameField)); 

它转换为:

 [null,null,null,null,null,null,[null,null,null,null,null,null,null,null,null,null,"player1"]] 

这真的是不必要的开销。

难道不能生成这样的东西吗?

 {"6": {"10":"player1"}} 

我正在使用node.js游戏服务器btw。

那么如何减less数据呢? 有没有特殊的JSON.stringify方法?

你可以使用一个对象而不是一个数组。

 var gameField = {}; gameField[6] = gameField[6] || {}; gameField[6][10] = "player1"; console.log(JSON.stringify(gameField)); 

您可以使用替代函数来自定义jsonparsing。 然而,parsingreviver将取决于如何识别内部对象。 例如,如果内部对象是string,如下例所示:

 var gameField = []; gameField[6] = []; gameField[6][10] = "player1"; function replacer(key,val){ if(val instanceof Array){ return val.reduce((o,el,i)=>{ if(el)o[i] = el; return o; },{}); } return val; } var json = JSON.stringify(gameField, replacer); console.log("JSON: ", json); function reviver(key,val){ if(typeof val === 'string') return val; return Object.keys(val).reduce((arr,k) =>{ arr[k] = val[k]; return arr; }, [] ); } gameField = JSON.parse(json, reviver); console.log("Parsed: ", gameField); 

如果你想从数组中删除null ,使用下划线库。

npm install underscore --save

在相关代码所在的文件中,

 var _ = require('underscore'); 

删除null只是传递

 result = _.filter(result, function(item){ return item!= null; }); 

result将是一个没有null的数组。