如何更改 JavaScript 对象的顺序?

问题描述 投票:0回答:5

我的 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
  }
}

有什么可行的方法吗?

javascript javascript-objects
5个回答
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
        }
    ]
}

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 对象本质上是无序的。
你不能这样做。


0
投票

虽然不建议这样做,因为 JavaScript 标准没有定义对象属性的顺序,但实际上,属性是按添加时间按时间顺序排序的。您可以像这样创建对象的排序副本:

const sorted = Object.fromEntries(Object.entries(object).sort((a, b) => a[1].key - b[1].key));
© www.soinside.com 2019 - 2024. All rights reserved.