js数据类型对象(Object)的自动排序问题

前言

这两天碰到一个问题。发现游戏(塔防类游戏)中炮塔寻怪算法有误,炮塔无法准确的找到最危险的怪物(也就是射程范围内离终点最近)。最后查看代码发现,以前怪物查询算法只需查询最危险的怪物,所以遍历所有的怪物,记录最危险那只就可以了。后来策划新增需求,炮塔需要短时间内陆续攻击最危险的N只怪。所以算法上就改成先将所有怪物排序,再取所需的怪物。因为排序有使用到两个变量排序用的 怪物剩余路程 和 怪物实例 。考虑到数组存储不方便,而且需要特别的写排序代码。想到Object是存在Key自动排序功能的,所以使用了一个Object去遍历后存储怪物(剩余路程为key,怪物实例为value)。最后事与愿违,并没有得到想要的结果。下面也就以此为例,带大家了解一下 对象(Object)的自动排序问题。

一、object的自动排序功能

我们在开发游戏的过程中常会遇到这种情况,将几个聊天频道的的聊天消息按时间顺序重新排序放到综合频道展示。或是服务器发了一堆战斗记录(不保证顺序)给我们展示。我们要快速的处理这些事情,经常会用到object的自动排序功能,下面代码做一段object的自动排序功能

var printObject = function(obj){
    console.log(`printObject begin`);
    var i = 0;
    for(var key in obj){
        console.log(`key${i} ${key}:${obj[key]}`);
        i++;
    }
    console.log(`printObject end`);
}

var randomObject = function(num){
    let numObj = {};
    for(var i = 0; i<num; i++){
        let numStr = Math.floor(Math.random()*3);
        let randomNum = Math.floor(Math.random()*(Math.pow(10, numStr)));
        console.log(`random key${i}:${randomNum}`);
        numObj[randomNum] = "fdsf";
    }
    printObject(numObj);
    return numObj;
}

二、object的自动排序测试

运行以上的随机函数结果如下:

运行: randomOjbect(5)
结果:
random key0:9
random key1:99
random key2:0
random key3:6
random key4:53
printObject begin
key0 0:fdsf
key1 6:fdsf
key2 9:fdsf
key3 53:fdsf
key4 99:fdsf
printObject end

运行: randomOjbect(5)
结果:
random key0:9
random key1:99
random key2:0
random key3:6
random key4:53
printObject begin
key0 0:fdsf
key1 6:fdsf
key2 9:fdsf
key3 53:fdsf
key4 99:fdsf
printObject end

三、Object混合属性的自动排序功能

以上两次运行结果可以发现,对象能对属性正确的自动排序,所以直觉的可以认为以number为属性的对象,都能以从小到大的顺序自动排序。但是事实真是如此吗?如果是这样,那文章一开头描述的问题又是什么情况呢?接下来我们对随机函数稍作修改,继续测试几次:

var randomObject = function(num, hasFloat){
    let numObj = {};
    for(var i = 0; i<num; i++){
        let numStr = Math.floor(Math.random()*6);
        let randomNum = Math.floor(Math.random()*(Math.pow(10, numStr)));
        let numLen = randomNum.toString().length;
        let dotpoint = Math.floor(Math.random()*numLen);//随机小数部分的位数
        if(hasFloat && Math.floor(Math.random()*2 === 0)){
            dotPoint = 0;
        }
        randomNum = randomNum/Math.pow(10, dotPoint);   //对整数进行小数处理
        console.log(`random key${i}:${randomNum}`);
        numObj[randomNum] = "fdsf";
    }
    printObject(numObj);
    return numObj;
}

四、混合自动排序测试


以上函数主要修改是,将在随机数中添加部分浮点数。这样整个属性中就有整形number,也有浮点型number。这样结果又会怎样呢?
下面一样随机允许两次看看结果

运行: randomOjbect(5, true)
结果:
random key0:7
random key1:4308
random key2:5.1
random key3:3
random key4:4.4605

printObject begin
key0 3:fdsf
key1 7:fdsf
key2 4308:fdsf
key3 5.1:fdsf
key4 4.4605:fdsf
printObject end

运行: randomOjbect(5, true)
结果:
random key0:39
random key1:447.5
random key2:69
random key3:5.26
random key4:7

printObject begin
key0 7:fdsf
key1 39:fdsf
key2 69:fdsf
key3 447.5:fdsf
key4 5.26:fdsf
printObject end

由上面的结果可以看出,属性排序后并不是完全由小到大的排序,其中分整数和浮点数部分,整数部分为数字大小从小到大排序。浮点数部分则并未排序,是按照放入的顺序排序。

总结


由此总结几点如下:

  • JS存在自动排序机制
  • 自动排序规则如下
    • 整数数字属性,按从小到大排序
    • 字符串属性,不进行自动排序。按照写入的顺序排序。
    • 浮点型属性,按照字符串属性方式处理
    • 同时存在整数数字类型和字符串类型时。优先排列整数数字类型。

下面提供 整数数字、浮点型数字、和字符串 三种属性的排序测试代码 【查看】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351