我正在写一个简单的游戏。它基于32x32正方形的字段。每个方块都可以包含游戏元素。当元素出现/移动/更改时,服务器发送一个包含2d数组的json对象,该数组类似于整个游戏字段,其所有元素都通过websockets传递给所有客户端。
当发送到多个客户端时,这是非常多的数据,每秒多次。
所以我想知道如何减少它。
我认为从客户端已经收到的大阵列中删除所有内容会有所帮助。但如果你有这样的事情:
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。
那么如何减少数据呢?可能有一个特殊的JSON.stringify方法吗?
答案 0 :(得分:2)
您可以使用对象而不是数组。
var gameField = {};
gameField[6] = gameField[6] || {};
gameField[6][10] = "player1";
console.log(JSON.stringify(gameField));

答案 1 :(得分:0)
您可以使用replacer函数自定义json解析。然而,解析reviver
将取决于如何识别内部对象。例如,如果内部对象是字符串,如示例所示:
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);
答案 2 :(得分:-1)
如果要从数组中删除 null ,请使用下划线库。
npm install underscore --save
在你的文件中有相关代码,
var _ = require('underscore');
要删除null,只需传递
result = _.filter(result, function(item){
return item!= null;
});
result
将是一个没有任何null的数组。