Я просто хочу сортировать данные со стороны сервера, используя usort descending & hellip; для того, чтобы получить user_id в первой позиции Hw, возможно [дублировать]

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

/**
 * Sorts an object into an order
 *
 * @require jQuery
 *
 * @param object Our JSON object to sort
 * @param type Only alphabetical at the moment
 * @param identifier The array or object key to sort by
 * @param order Ascending or Descending
 *
 * @returns Array
 */
function sortItems(object, type, identifier, order){

    var returnedArray = [];
    var emptiesArray = []; // An array for all of our empty cans

    // Convert the given object to an array
    $.each(object, function(key, object){

        // Store all of our empty cans in their own array
        // Store all other objects in our returned array
        object[identifier] == null ? emptiesArray.push(object) : returnedArray.push(object);

    });

    // Sort the array based on the type given
    switch(type){

        case 'alphabetical':

            returnedArray.sort(function(a, b){

                return(a[identifier] == b[identifier]) ? 0 : (

                    // Sort ascending or descending based on order given
                    order == 'asc' ? a[identifier] > b[identifier] : a[identifier] < b[identifier]

                ) ? 1 : -1;

            });

            break;

        default:

    }

    // Return our sorted array along with the empties at the bottom depending on sort order
    return order == 'asc' ? returnedArray.concat(emptiesArray) : emptiesArray.concat(returnedArray);

}
458
задан mellowsoon 2 April 2011 в 21:54
поделиться

8 ответов

Нет, порядок свойств объектов не гарантируется в JavaScript; вам нужно использовать Array.

Определение объекта из ECMAScript Third Edition (pdf) :

4.3.3 Объект

Объект является членом типа Object. Это неупорядоченный набор свойств, каждый из которых содержит примитивное значение, объект или функцию. Функция, хранящаяся в свойстве объекта, называется методом.

Поскольку ECMAScript 2015, использование объекта Map может быть альтернативой. A Map разделяет некоторые сходства с Object и гарантирует порядок ключей :

Карта выполняет итерацию своих элементов в порядке размещения, тогда как порядок итерации не указан для объектов.

348
ответ дан trincot 22 August 2018 в 05:16
поделиться
  • 1
    Сделайте массив пар. [["key1", "value1"], ["key2", "value2"]] или [{"key1": "value1"}, {"key2": "value2"}]. Оберните это в своем классе, и проблема решена! var o = new OrderedObject([{key1: "blah"}]); o.key1 = "I am a value set with a setter" – trusktr 20 February 2015 в 01:36
  • 2
    Этот ответ неверен в ES2015. – Benjamin Gruenbaum 30 September 2015 в 18:53
  • 3
    @BenjaminGruenbaum Вы должны быть смущены добавлением карт? Ключи объектов по-прежнему повторяются в неуказанном порядке с ES2015, но Карты гарантируют заказ. [Д0] developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… – bpierre 12 October 2015 в 10:58
  • 4
    @BenjaminGruenbaum действительно! Но см. 9.1.11 ( ecma-international.org/ecma-262/6.0/… ) тоже: «Механика и порядок перечисления свойств не указаны». Обсуждение здесь esdiscuss.org/topic/… – bpierre 12 October 2015 в 14:23
  • 5
    @CyrilN. о нет, вы запутались еще-еще-js-ловушкой. Массивы также являются объектами. Когда вы делаете a[3] = "val", вы вставляете в массив, и это, очевидно, упорядочено (по индексу 3). Когда вы выполняете a['key1'] = "val" или (эквивалент) a.key1 = "val", вы добавляете к объекту новое свойство, которое не гарантируется. Подумайте об этом как о массиве «элементы». и Object & quot; свойства ". Объект массива имеет оба, но они не являются одной и той же коллекцией. – tothemario 27 September 2016 в 17:11

Во время записи большинство браузеров возвращали свойства в том же порядке, в каком они были вставлены, но это явно не гарантированное поведение, поэтому на него не следует полагаться.

Спецификация ECMAScript говорила:

Механика и порядок перечисления свойств ... не указаны.

Однако в ES2015 и более поздние нецелые ключи будут возвращены в порядке вставки.

62
ответ дан Alnitak 22 August 2018 в 05:16
поделиться
  • 1
    Chrome реализует другой порядок для других браузеров. См. code.google.com/p/v8/issues/detail?id=164 – Tim Down 2 April 2011 в 22:17
  • 2
    Opera 10.50 и выше, а также IE9 соответствуют заказу Chrome. Firefox и Safari теперь являются меньшинством (и оба они также используют разные заказы для объектов / массивов). – gsnedders 3 April 2011 в 01:03
  • 3
    Возможно, мы можем прояснить ситуацию, указав случаи, когда порядок не будет сохранен. Я., я ошибаюсь или единственная возможность, где ваши свойства являются числовыми строками? – Veverke 10 March 2015 в 15:09
  • 4
    @Veverke явно не гарантировано на заказ, поэтому всегда следует считать, что порядок является фактически случайным. – Alnitak 10 March 2015 в 15:11
  • 5
    Этот ответ неверен в ES2015. – Benjamin Gruenbaum 30 September 2015 в 18:53

Текущий язык Spec: технически, порядок не указан.

Текущие браузеры: порядок сохраняется с большим исключением таких ключей, как «7», которые анализируются как целые числа и обрабатываются по-разному с помощью Chrome / V8.

Спецификация будущего языка (> ES2015): Как правило, вы можете ожидать, что упорядоченные сегодня вещи не будут неупорядочены. Новые API гарантируют заказ; существующие API трудно изменить. См. Ответ JMM для более подробной информации.

Лучшая ссылка ниже приведена в комментарии Tim Down:

http://code.google.com/p/v8/issues/ detail? id = 164

Эта ошибка подробно описывает проектные решения, связанные с реализацией ключевых заказов Chrome. Один вывод - это то, что для строковых ключей, которые не анализируют целое число (то есть «a» или «b», но не «3»), клавиши печатаются в порядке ввода во всех основных браузерах, и хотя это поведение не является «стандартизировано», оно IS считается существенной проблемой обратной совместимости поставщиками браузеров. Используйте на свой страх и риск.

По одному из (довольно упрямых) комментариев:

Стандарты всегда следуют за реализациями, вот откуда появился XHR, и Google делает то же самое путем внедрения Gears и последующего использования эквивалентной функциональности HTML5. Правильное решение состоит в том, чтобы ECMA формально включала де-факто стандартное поведение в следующий оборот спецификации.

Если вы полагаетесь на порядок вставки, вы находитесь за пределами спецификации ECMAScript, но внутри де-факто стандарт общего поведения браузера , если ваши ключи не анализируются как целые числа .

110
ответ дан Bhuwan 22 August 2018 в 05:16
поделиться
  • 1
    Этот ответ неверен в ES2015. Стандарт . – Benjamin Gruenbaum 30 September 2015 в 18:53
  • 2
    @BenjaminGruenbaum - это была моя точка точно. По состоянию на 2014 год все основные поставщики имели общую реализацию, и, следовательно, стандарты в конечном итоге последуют (т. Е. В 2015 году). – Dave Dopson 1 October 2015 в 02:01
  • 3
    Кстати: React createFragment API уже полагается на это ... – mik01aj 4 July 2016 в 15:44
  • 4
    @BenjaminGruenbaum Ваш комментарий неверен. В ES2015 порядок гарантирован только для выбранных методов . См. answer of ftor ниже. – Piotr Dobrogost 7 October 2016 в 15:34

Весь этот ответ находится в контексте соответствия спецификации, а не того, что движок делает в определенный момент или исторически.

Как правило, нет

. Фактический вопрос очень расплывчатый.

будут ли свойства в том же порядке, что я добавил их

В каком контексте?

Ответ: это зависит от ряда факторов. В общем, no .

Иногда да

Здесь вы можете рассчитывать на порядок ключей свойств для plain Objects:

  • Соответствующий ES2015 двигатель
  • Собственные свойства
  • Object.getOwnPropertyNames(), Reflect.ownKeys(), Object.getOwnPropertySymbols(O)

Во всех случаях эти методы включают неперечислимые ключи свойств и ключи заказа, указанные в [[OwnPropertyKeys]] (см. ниже). Они различаются по типу ключевых значений, которые они включают (String и / или Symbol). В этом контексте String включает целые значения.

Object.getOwnPropertyNames(O)

Возвращает собственные свойства String O ] ).

Reflect.ownKeys(O)

Возвращает O собственные String - и Symbol клавиши свойства.

Object.getOwnPropertySymbols(O)

Возвращает собственные свойства Symbol O.

[[OwnPropertyKeys]]

Порядок по существу: целочисленный Strings в порядке возрастания, нецелоподобный Strings в порядке создания, Символы в порядке создания. В зависимости от того, какая функция вызывает это, некоторые из этих типов могут не включаться.

Специфическим языком является то, что ключи возвращаются в следующем порядке:

  1. .. каждый собственный ключ свойства P O [объект, который повторяется], который является целым индексом, в порядке возрастания числового индекса
  2. ... каждый собственный ключ свойства P из O который является строкой, но не является целым индексом, в порядке создания свойства
  3. ... каждый собственный ключ свойства P из O, который является символом, в порядке создания свойства

Map

Если вас интересуют упорядоченные карты, вы должны рассмотреть возможность использования типа Map, введенного в ES2015, вместо обычного Objects.

35
ответ дан cxw 22 August 2018 в 05:16
поделиться
  • 1
    В этом случае ответ был всего лишь правильной формой расплывчатости, чтобы получить хорошие ответы. – Andy 9 January 2018 в 17:09

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

var myarr = [{somfield1: 'x', somefield2: 'y'},
{somfield1: 'a', somefield2: 'b'},
{somfield1: 'i', somefield2: 'j'}];

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

3
ответ дан Drew Durham 22 August 2018 в 05:16
поделиться

Порядок свойств в нормальных объектах является сложным объектом в Javascript.

Хотя в ES5 явно не указан порядок, ES2015 имеет порядок в определенных случаях. Это следующий объект:

o = Object.create(null, {
  m: {value: function() {}, enumerable: true},
  "2": {value: "2", enumerable: true},
  "b": {value: "b", enumerable: true},
  0: {value: 0, enumerable: true},
  [Symbol()]: {value: "sym", enumerable: true},
  "1": {value: "1", enumerable: true},
  "a": {value: "a", enumerable: true},
});

Это приводит к следующему порядку (в некоторых случаях):

Object {
  0: 0,
  1: "1",
  2: "2",
  b: "b",
  a: "a",
  Symbol(): "sym"
}
  1. целые ключи в порядке возрастания
  2. нормальные клавиши в порядке ввода
  3. Символы в порядке вставки

Таким образом, существует три сегмента, которые могут изменить порядок вставки (как это произошло в пример). И целые ключи не придерживаются порядка вставки.

Вопрос в том, какие методы этот порядок гарантирован в спецификации ES2015?

Следующие методы гарантируют показанный порядок:

  • Object.assign
  • Object.defineProperties
  • Object.getOwnPropertyNames
  • Object.getOwnPropertySymbols
  • ]
  • Reflect.ownKeys

Следующие методы / петли не гарантируют никакого порядка:

  • Object.keys
  • для ..in
  • JSON.parse
  • JSON.stringify

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

46
ответ дан ftor 22 August 2018 в 05:16
поделиться
  • 1
    Это наиболее исчерпывающий ответ со всеми неясными углами языка. Я никогда не слышал о Symbol! – Gordon 19 July 2016 в 19:41
  • 2
    Я грубо протестировал вывод в узле v8.11, и это правильно. – merlin.ye 20 July 2018 в 05:31
  • 3
    – evolutionxbox 17 October 2018 в 08:46

Из стандарта JSON :

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

(выделение мое).

Итак, нет, вы не можете гарантировать заказ.

-4
ответ дан Kevin Lacquement 22 August 2018 в 05:16
поделиться
  • 1
    это указано стандартом ECMAScript, а не спецификацией JSON. – Alnitak 2 April 2011 в 22:01
  • 2
    @Alnitak, @Iacqui: JSON принимает это только из спецификации ECMAScript. Он также задан для JSON, но на самом деле это не относится к вопросу. – Paŭlo Ebermann 2 July 2011 в 13:57

В современных браузерах вы можете использовать структуру данных Map вместо объекта.

Разработчик mozilla> Map

Объект Map может выполнять итерацию своих элементов в порядке размещения ...

7
ответ дан Michel 22 August 2018 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: