如何改变JavaScript对象的顺序?

11

我的JavaScript对象长这样:

"ivrItems": {
  "50b5e7bec90a6f4e19000001": {
    "name": "sdf",
    "key": "555",
    "onSelect": "fsdfsdfsdf"
  },
  "50b5e7c3c90a6f4e19000002": {
    "name": "dfgdf",
    "key": "666",
    "onSelect": "fdgdfgdf",
    "parentId": null
  },
  "50b5e7c8c90a6f4e19000003": {
    "name": "dfdf",
    "key": "55",
    "onSelect": "dfdffffffffff",
    "parentId": null
  }
}

现在我想要动态地改变对象的顺序。

排序后,对象应该如下所示:

"ivrItems": {
  "50b5e7bec90a6f4e19000001": {
    "name": "sdf",
    "key": "555",
    "onSelect": "fsdfsdfsdf"
  },
  "50b5e7c8c90a6f4e19000003": {
    "name": "dfdf",
    "key": "55",
    "onSelect": "dfdffffffffff",
    "parentId": null
  }
  "50b5e7c3c90a6f4e19000002": {
    "name": "dfgdf",
    "key": "666",
    "onSelect": "fdgdfgdf",
    "parentId": null
  }
}

有没有可能的办法来做到这一点?


为什么?用于迭代?用于序列化? - Richard JP Le Guen
你应该使用一个 JavaScript 对象数组,参考这里的问题:https://dev59.com/XXNA5IYBdhLWcg3wZ85R - Switch
4个回答

4
为了获取并更改对象枚举的顺序,您需要手动定义顺序。通常通过将对象的属性添加到数组中来完成此操作。
var keys = Object.keys(data.ivrItems);

现在您可以迭代 keys 数组,并使用这些键来访问您的 irvItems 对象的成员。
keys.forEach(function(key) {
    console.log(data.irvItems[key]);
});

现在的顺序将始终是Object.keys给出的顺序,但不能保证顺序符合您的要求。

您可以使用任何排序方式对该数组进行重新排序以满足您的需要。

keys.sort(function(a, b) {
    return +data.irvItems[a].key - +data.irvItems[b].key;
});

这种排序将按每个对象的嵌套key属性进行数字转换后进行排序。


2
您应该使用一个数组。对象键没有顺序。
就像这样:
{
    "ivrItems": [
        {
            "id": "50b5e7bec90a6f4e19000001",
            "name": "sdf",
            "key": "555",
            "onSelect": "fsdfsdfsdf"
        },
        {
            "id": "50b5e7c8c90a6f4e19000003",
            "name": "dfdf",
            "key": "55",
            "onSelect": "dfdffffffffff",
            "parentId": null
        },
        {
            "id": "50b5e7c3c90a6f4e19000002",
            "name": "dfgdf",
            "key": "666",
            "onSelect": "fdgdfgdf",
            "parentId": null
        }
    ]
}

"ivrItems": [ "50b5e7bec90a6f4e19000001": { "name": "sdf", "key": "555", "onSelect": "fsdfsdfsdf" }, "50b5e7c3c90a6f4e19000002": { "name": "dfgdf", "key": "666", "onSelect": "fdgdfgdf", "parentId": null }] 类似这样的东西 - gauti
@GowtGM:不,那是无效的语法。 - SLaks
@GowtGM:我在答案中添加了示例。 - Chris Li
这里有一个对我有用的答案: https://dev59.com/JmQn5IYBdhLWcg3w1Z9f#16543302,它说要使用`JSON.stringify()`的第二个参数,并提供按照你想要的顺序排列的键名数组。 - Benj
1
这是错误的。JavaScript对象有序的。 - Glenn Maynard

2

如果你在浏览器中进行此操作,可能会遇到跨浏览器兼容性的问题。但是,计算机大多数情况下都是确定性的,因此您可以在一个JavaScript引擎实现中可靠地完成此操作。例如,在Chrome REPL /控制台中,您可以通过按顺序添加属性来获得此顺序:

var n = {}
n.b = 2
n.c = 3
var m = {}
m.c = 3
m.b = 2
JSON.stringify(n)
> "{"b":2,"c":3}"
JSON.stringify(m)
> "{"c":3,"b":2}"

因此,您可以重构对象,按照您希望稍后查找它们的顺序添加键。

但其他人是正确的,如果您想要真正可预测的顺序,应该使用数组。


0

Javascript对象本质上是无序的。
你不能这样做。


谢谢,有什么想法可以将上述对象更改为数组,键50b5e7bec90a6f4e19000001等非常重要,在任何给定的时刻我只知道这些键... - gauti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接