Сортировка объектов JSON с помощью jQuery или Javascript - PullRequest
0 голосов
/ 14 марта 2012

У меня возвращаются следующие данные JSON, но по какой-то причине Javascript или jQuery ajax реорганизуют список элементов.Сервер возвращает данные, отсортированные в алфавитном порядке по item.title (проверено) ...

Ниже приведен JSON после того, как заказ был обработан:

   {
        "count": 3,
        "items": {
            "tardis": {
                "type": 40,
                "title": "Tardis",
                "timeMachine": true,
                "reliable": true
            },
            "stargate": {
                "type": "Milky way gate",
                "title": "Stargate + solar flare",
                "timeMachine": true,
                "reliable": false
            }
        }
    }

Кто-нибудь объясняет, почему выполняется заказ?подделаны?Как я могу переупорядочить элементы по значению заголовка?

Ответы [ 3 ]

5 голосов
/ 14 марта 2012

Ваш items объект не массив, а просто объект с именованными членами.Эти члены не имеют собственного порядка.

Например, выполнение console.log({ your object }) в chrome даст свойства, отсортированные по имени члена, в данном случае «stargate» и «tardis», в этом порядке.Но запись for(k in x.items) console.log(k) для точно такого же объекта будет (в Chrome - опять же, здесь нет надежных спецификаций) перебирать объекты в порядке, в котором они были определены, и записывать "tardis", "stargate".

Этот порядок является артефактом представления объекта, а не самого объекта.Используйте массивы, если вы хотите заказать:

{
    "count": 3,
    "items": [
        {
            "key": "stargate",
            "type": "Milky way gate",
            "title": "Stargate + solar flare",
            "timeMachine": true,
            "reliable": false
        },
        {
            "key": "tardis",
            "type": 40,
            "title": "Tardis",
            "timeMachine": true,
            "reliable": true
        }
    ]
}
3 голосов
/ 14 марта 2012

Ключи объекта расположены не в определенном порядке. Они могут быть возвращены в любом порядке после помещения в объект javascript. Это как язык был разработан и как указано.

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

Массивы имеют согласованный порядок, объекты - нет.

Мне кажется, что вам может понадобиться структура данных, которая выглядит следующим образом:

{
    "count": 3,
    "items": [
        { 
            "name": "tardis",
            "type": 40,
            "title": "Tardis",
            "timeMachine": true,
            "reliable": true
        },
            "name": "stargate",
            "type": "Milky way gate",
            "title": "Stargate + solar flare",
            "timeMachine": true,
            "reliable": false
        }
    ]
}

Таким образом, элементы находятся в массиве с определенным порядком: items[0], items[1] и т. Д. *

К вашему сведению, когда вы делаете это таким образом, вам не нужно значение "count", потому что массив items будет иметь items.length.

Без значения счетчика весь ваш ответ может быть просто массивом объектов:

    [
        { 
            "name": "tardis",
            "type": 40,
            "title": "Tardis",
            "timeMachine": true,
            "reliable": true
        },
            "name": "stargate",
            "type": "Milky way gate",
            "title": "Stargate + solar flare",
            "timeMachine": true,
            "reliable": false
        }
    ]
1 голос
/ 14 марта 2012

Если вы прочитали спецификацию JSON по адресу http://www.json.org/, Вы встретите эту строку - Объект - это неупорядоченный набор пар имя / значение

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...