首页 > 解决方案 > 对象键顺序

问题描述

将对象插入另一个对象时,我不明白这种安排。在这个例子中:

const list = {
    "mainVal": {
    }
}

list['mainVal']['010'] = {"a" : "1"}
list['mainVal']['020'] = {"a" : "1"}
list['mainVal']['021'] = {"a" : "1"}
list['mainVal']['023'] = {"a" : "1"}
list['mainVal']['031'] = {"a" : "1"}
list['mainVal']['032'] = {"a" : "1"}
list['mainVal']['300'] = {"a" : "1"}

结果:

{
    "mainVal": {
        "300": {
            "a": "1"
        },
        "010": {
            "a": "1"
        },
        "020": {
            "a": "1"
        },
        "021": {
            "a": "1"
        },
        "023": {
            "a": "1"
        },
        "031": {
            "a": "1"
        },
        "032": {
            "a": "1"
        }
    }
}

最后一次“插入”时,为什么现在300钥匙在对象的顶部?所以它不是按时间顺序,也不是按字母顺序。

我检查了相关问题:

JavaScript 是否保证对象属性顺序?

ES6 是否为对象属性引入了明确定义的枚举顺序?

但他们都谈到了财产的安排。我特别询问按键的排列。他们说它是按时间顺序或按字母顺序排列的,但这里不是这种情况。

如何使其按字母顺序排列(或者如果不可能,那么我可以强制它按时间顺序排列吗?):

{
    "mainVal": {
        "010": {
            "a": "1"
        },
        "020": {
            "a": "1"
        },
        "021": {
            "a": "1"
        },
        "023": {
            "a": "1"
        },
        "031": {
            "a": "1"
        },
        "032": {
            "a": "1"
        },
        "300": {
            "a": "1"
        }
    }
}

任何人都可以阐明一下吗?谢谢

标签: javascriptnode.js

解决方案


那是因为整数索引出现在字符串索引之前,然后字符串索引出现在符号之前。

300是一个整数索引,而010是一个字符串索引。

这是我找到的一个很好的介绍。

我想要订购它们,您必须使用数组(按您想要的方式对它们进行排序),或者将其保存在一种类型的索引中。因此,例如,您可以通过在将每个键插入对象之前为每个键加上下划线来转换为字符串。

例子:

const x = {
    "010": {
        "a": "1"
    },
    "020": {
        "a": "1"
    },
    "021": {
        "a": "1"
    },
    "023": {
        "a": "1"
    },
    "031": {
        "a": "1"
    },
    "032": {
        "a": "1"
    },
    "300": {
        "a": "1"
    }
}

let sorted = Object.keys(x)
    .sort((a, b) => parseInt(a) - parseInt(b))
    .map((key) => ({__key: key, ...x[key]}));


回报:


[ { __key: '010', a: '1' },
  { __key: '020', a: '1' },
  { __key: '021', a: '1' },
  { __key: '023', a: '1' },
  { __key: '031', a: '1' },
  { __key: '032', a: '1' },
  { __key: '300', a: '1' } ]

代理人

更好的是,您可以使用代理(IE11 不支持):

let y = new Proxy(x, {
    ownKeys(target) {
        return Object.keys(target)
            .sort((a, b) => parseInt(a) - parseInt(b))
    }
})

Proxy实际上将返回您想要的带有排序键的对象:

{ '010': { a: '1' },
  '020': { a: '1' },
  '021': { a: '1' },
  '023': { a: '1' },
  '031': { a: '1' },
  '032': { a: '1' },
  '300': { a: '1' } }

推荐阅读