V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
• 请用平和的语言准确描述你所遇到的问题
• 厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
• 如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
clf
V2EX  ›  全球工单系统

Google Chrome 的一个 BUG?或设定?

  •  
  •   clf · 2021-08-06 16:51:11 +08:00 · 1344 次点击
    这是一个创建于 1237 天前的主题,其中的信息可能已经有所发展或是发生改变。

    开发者工具-网络-点击一个返回 json 的链接,发现 priview 和 response 的排序是不一样的。

    以下是乱序的部分,接口下发的 user 是在 MzM=前面的,但在 priview 里是倒过来的,js 里和 priview 是一样的顺序。所以,这是 js 的某种设定么? [ postman 里顺序是和接口下发的 response 一致的]

    {
        "user": {
            "title": "用户信息",
            "type": "user",
            "coded": false,
            "display": [
                "name"
            ],
            "scored": false,
            "readonly": false,
            "invisible": false
        },
        "MzM=": {
            "title": "33",
            "type": "decimal",
            "coded": false,
            "scored": false,
            "readonly": false,
            "invisible": false
        }
    }
    
    第 1 条附言  ·  2021-08-06 17:51:53 +08:00
    已经知道问题了。

    网络的 priview 以及 console 里的 object 打印输出在 Chrome 下都是重新排序过的。

    而在实际的 js 对象里的顺序是和接口顺序一样的,页面渲染(接口下发的 jsonSchema )出来的表单顺序是正常的。

    但同样的在 firefox 里 priview 的排序以及 console.log 的输出是正常的。所以,并不是 Chrome 无法做到输出无序的 js,而是 Chrome 做了一个很……的决定。

    关于 Object 无序,个人理解是:不会像 Java 里的 TreeMap 等一样插入时进行排序或打乱你的位置。就像 Chrome 自身在实现 Object 的时候也是能够正确还原对象本身原来的顺序(插入顺序 /生成顺序)的,只有在打印的时候才会出现这种乱序问题。

    我个人认为 Chrome 的打印方法有问题。

    相关内容:
    https://stackoverflow.com/questions/24241761/how-to-stop-json-data-to-automatically-sorting-in-google-chrome
    7 条回复    2021-08-08 12:17:11 +08:00
    temporary
        1
    temporary  
       2021-08-06 17:16:07 +08:00 via iPhone
    对象的键是无序的吧
    AoEiuV020
        2
    AoEiuV020  
       2021-08-06 17:26:08 +08:00
    json object 本来就是无序的,preview 应该是内部解析了一遍再打印出来,顺序不能保证,
    要确定的顺序用 json array,
    codehz
        3
    codehz  
       2021-08-07 15:43:01 +08:00
    按规范就是无序的,你有序只是幻觉,或者说是巧合
    比如
    o={1: 2, "3": 5, "2": 4, "a": 6, 4: 7}
    Object.keys(o)
    在 chrome 里会得到 ["1", "2", "3", "4", "a"]
    clf
        4
    clf  
    OP
       2021-08-07 20:26:09 +08:00
    @codehz #3 嗯,发现了,但有个很难解释的情况:

    在直接使用此对象时,比如 JsonSchema 去按 Object 的顺序渲染表单,表单的顺序和此对象的实际顺序是一致的,而和打印 /遍历顺序是不一致的。是否可以表明,在某种情况下其实是可以以插入顺序 /生成顺序读取的。不然的话 JsonSchema 的表单结构设计为何不是 Array 而是 Object:

    这是 react-jsonschema-form 的 JsonSchema 描述表单字段的部分:

    "properties": {
    "firstName": {
    "type": "string",
    "title": "First name",
    "default": "Chuck"
    },
    "lastName": {
    "type": "string",
    "title": "Last name"
    },
    "telephone": {
    "type": "string",
    "title": "Telephone",
    "minLength": 10
    }
    }
    codehz
        5
    codehz  
       2021-08-08 08:33:10 +08:00 via Android
    @lychs1998 这没啥不好解释的,用无序的对应无序的有啥问题呢,你换个顺序 JSON Schema 就不认了吗
    codehz
        6
    codehz  
       2021-08-08 08:34:32 +08:00 via Android
    哦,是说渲染表单啊, 你猜猜 ui:order 是干啥的
    clf
        7
    clf  
    OP
       2021-08-08 12:17:11 +08:00
    @codehz #5
    换了顺序后表单的组件顺序也变了。

    ui:order 字段没有用到;目前页面上显示顺序都是对的,即便在输出到控制台时会重新排序。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5780 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:43 · PVG 09:43 · LAX 17:43 · JFK 20:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.