You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActionScript遍历JSON的itemsObj顺序反转,拼接结果不符预期求助

解决ActionScript中对象属性遍历顺序导致的字符串拼接顺序问题

我需要将JSON字符串中的键值对用|连接,但在ActionScript中,itemsObj的内容拼接顺序是从后往前的,与预期不符。

示例JSON

{
    "100_npc": {
      "uniqueId": 9000234,
      "username": "[NPC]Pelican",
      "bitmask": 1,
      "itemsObj": {
        "colour_id": 0,
        "head": 0,
        "face": 0,
        "neck": 0,
        "body": 0,
        "hand": 0,
        "feet": 0,
        "flag_id": 0,
        "photo_id": 0,
        "x_corr": 100,
        "y_corr": 100,
        "frame": 0,
        "is_member": 1,
        "total_membership_days": 0
      },
      "isEnabled": true
    }
}

原代码

function onloadCompleteNPC(event) {
    var _loc4 = event.target.data;
    for (var key in _loc4) {
        if (_loc4.hasOwnProperty(key)) {
            var item = _loc4[key];
            var roomId = key.split('_')[0];
            if(roomId === "130") {
                var joinArr = [item.uniqueId, item.username];
                for (var objKey in item.itemsObj) {
                    joinArr.push(item.itemsObj[objKey]);
                }
                var npcStr = joinArr.join('|');
                Test(npcStr, roomId);
            }
        }
    }
}

function Test(str, roomId) {
    trace("NPC String: " + str + " Room ID: " + roomId);
}

实际结果

9000251|[NPC]Pelican|0|1|0|100|100|0|0|0|0|0|0|0|0|0 

预期结果

9000251|[NPC]Pelican|0|0|0|0|0|0|0|0|0|100|100|0|1|0

问题原因

ActionScript与JavaScript的for-in循环遍历对象属性的规则不同:ActionScript不会严格遵循JSON定义的属性顺序遍历,而是可能按照内部存储的逆序或哈希顺序返回属性,直接导致拼接顺序错乱。使用reverse()无效,因为问题根源是遍历顺序错误,而非数组本身需要反转。

解决方案

不要依赖for-in的不确定遍历顺序,显式定义itemsObj的属性顺序数组,按照这个数组依次取值拼接,就能保证顺序符合预期。

修改后的代码

function onloadCompleteNPC(event) {
    var _loc4 = event.target.data;
    // 显式定义itemsObj的属性顺序,与JSON中的顺序完全一致
    var itemKeys:Array = ["colour_id", "head", "face", "neck", "body", "hand", "feet", "flag_id", "photo_id", "x_corr", "y_corr", "frame", "is_member", "total_membership_days"];
    for (var key in _loc4) {
        if (_loc4.hasOwnProperty(key)) {
            var item = _loc4[key];
            var roomId = key.split('_')[0];
            if(roomId === "130") {
                var joinArr = [item.uniqueId, item.username];
                // 按预定义顺序遍历属性并取值
                for each (var objKey:String in itemKeys) {
                    joinArr.push(item.itemsObj[objKey]);
                }
                var npcStr = joinArr.join('|');
                Test(npcStr, roomId);
            }
        }
    }
}

function Test(str, roomId) {
    trace("NPC String: " + str + " Room ID: " + roomId);
}

方案说明

通过预定义属性顺序数组,我们不再依赖for-in的不确定遍历行为,而是主动按照需求的顺序获取属性值,这样无论在ActionScript还是JavaScript环境中,都能得到一致的拼接结果。这也是处理对象属性顺序相关问题的通用可靠方案——因为ECMAScript规范早期并未强制for-in的遍历顺序,不同实现可能存在差异。

内容的提问来源于stack exchange,提问作者Zesty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:02:54