【问题标题】:Array with less values than length - null-overhead in json值小于长度的数组 - json 中的空开销
【发布时间】:2016-11-28 17:38:15
【问题描述】:

我正在编写一个简单的游戏。它基于一个 32x32 正方形的字段。每个方块可以包含一个游戏元素。当元素出现/移动/更改时,服务器会通过 websocket 向所有客户端发送一个包含 2d 数组的 json 对象,该数组类似于整个游戏场及其所有元素。

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

所以我想知道如何减少这种情况。

我认为这将有助于从客户已经收到的大数组中删除所有内容。但如果你有这样的事情:

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 作为游戏服务器。

那么如何减少数据呢?是否有特殊的 JSON.stringify 方法?

【问题讨论】:

  • 如果你使用普通对象而不是数组,它可能会有

标签: javascript arrays json node.js


【解决方案1】:

您可以使用对象而不是数组。

var gameField = {};

gameField[6] = gameField[6] || {};

gameField[6][10] = "player1";

console.log(JSON.stringify(gameField));

【讨论】:

  • 但是我的服务器端已经完全基于数组结构。所以当它被发送到客户端时我必须转换它。怎么可能做到?
  • @Forivin 这是一个单独的问题,不是吗?
  • 本来就是原版的。
【解决方案2】:

您可以使用替换函数自定义 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);

【讨论】:

    【解决方案3】:

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

    npm install underscore --save

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

    var _ = require('underscore');
    

    要删除 null 只需通过

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

    result 将是一个没有任何空值的数组。

    【讨论】:

    • 这会破坏解析器,因为它不再是有效的 json。
    • 但为什么要下划线? Array.prototype.filter 适用于所有合理相关的 Node 版本。
    • @Forivin 我建议的解决方案是从数组中删除 null。
    • @Pavlo 下划线库为 js 中的数组提供了许多易于执行的功能,这就是我喜欢它的原因。
    猜你喜欢
    • 2011-05-19
    • 2021-07-16
    • 2015-07-22
    • 2020-08-17
    • 2017-03-16
    • 2011-02-20
    • 2013-07-03
    • 2017-12-27
    • 1970-01-01
    相关资源
    最近更新 更多