Как изменить порядок объекта JavaScript?

Мой объект 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
  }
}

Есть ли способ сделать это?


person gauti    schedule 29.11.2012    source источник
comment
Почему? Для итерации? Для сериализации?   -  person Richard JP Le Guen    schedule 29.11.2012
comment
Вы должны использовать массив объектов javascript, обратитесь к этому вопросу здесь stackoverflow.com/questions/979256/   -  person Switch    schedule 29.11.2012


Ответы (4)


Вы должны использовать массив. Ключи объекта не имеют порядка

как это:

{
    "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
        }
    ]
}
person Chris Li    schedule 29.11.2012
comment
ivrItems: [50b5e7bec90a6f4e19000001: {name: sdf, key: 555, onSelect: fsdfsdfsdf}, 50b5e7c3c90a6f4e19000002: {name: dfgdf, key: 666, onSelect: fdgdfg, onSelect: fdgdfg - person gauti; 29.11.2012
comment
@GowtGM: нет; это недопустимый синтаксис. - person SLaks; 29.11.2012
comment
@GowtGM: я добавляю образец в ответ. - person Chris Li; 29.11.2012
comment
Здесь есть ответ, который помог мне: stackoverflow.com/a/16543302/1579667, в котором говорится об использовании второй параметр JSON.stringify() с массивом имен ключей в нужном вам порядке. - person Benj; 25.08.2017

Чтобы получить, а затем изменить порядок перечисления объектов, вам необходимо вручную определить порядок. Обычно это делается путем добавления свойств объекта в массив.

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 каждого объекта после числового преобразования.

person I Hate Lazy    schedule 29.11.2012

Объекты Javascript по своей сути неупорядочены.
Вы не можете этого сделать.

person SLaks    schedule 29.11.2012
comment
@ Спасибо, любая идея изменить вышеуказанный объект на массив, ключи 50b5e7bec90a6f4e19000001, .... очень важны, в любой момент я знаю только эти ключи ... - person gauti; 29.11.2012

У вас, вероятно, будут проблемы с кросс-браузерной совместимостью, если вы делаете это в браузере. Но компьютеры в основном детерминированы, поэтому вы, вероятно, могли бы надежно выполнить это в одной реализации движка 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}"

Таким образом, вы можете реконструировать свой объект, добавляя ключи в том порядке, в котором вы хотите найти их позже.

Но другие люди правы, если вам нужен истинный, предсказуемый порядок, вы должны использовать массив.

person chbrown    schedule 29.11.2012