#javascript #json
#javascript #json
Вопрос:
Я создаю объект javascript следующим образом
var myObjects ;
for(var i = 0; i <10;i ){
var eachObject = {"id" : i};
myObjects .push(eachObject );
}
message = {
"employeeDetails" : myObjects
}
После этого я упорядочиваю их следующим образом
JSON.stringify(message);
Выполняет ли приведенный выше метод упорядочивание объектов в том порядке, в котором они были ранее?
После stringify они будут в порядке 0,1,2 ….9, как это было ранее?
Комментарии:
1. Что мешает вам открыть консоль JavaScript в вашем веб-браузере и попробовать это?
2. Вы могли бы просто попробовать это:
JSON.parse(JSON.stringify([0,1,2,3,4,5,6,7,8,9]))
3. Опубликованное выше — это просто фиктивный объект. У меня огромный массив, который содержит более 3000 объектов, а также я не могу сказать, находятся ли они в определенном порядке, просто наблюдая глазами, поскольку они не могут содержать никакого индекса (уникальная вещь для определения его порядка)
4. Это ничего не меняет, работаете ли вы с большим или фиктивным объектом. Если тест, предложенный выше Джорджем Стокером или Цербрусом , дает вам удовлетворительные результаты, то вы должны добиться того же на своем реальном объекте, независимо от того, как долго он длится.
5. Этот вопрос кажется не по теме, потому что его можно просто протестировать с помощью нескольких строк кода.
Ответ №1:
В документах нет ничего, что явно подтверждало бы, что порядок элементов массива сохраняется. Однако в документах указано, что для свойств, отличных от массива, порядок не гарантируется:
Не гарантируется, что свойства объектов, не входящих в массив, будут упорядочены в каком-либо определенном порядке. Не полагайтесь на упорядочение свойств внутри одного и того же объекта в рамках stringification.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
Даже если порядок элементов массива будет сохранен, я бы не стал рассчитывать на это, а скорее отсортировал элементы самостоятельно. В конце концов, скорее всего, будет какая-то бизнес-логика или логика представления, которая указывает, как элементы должны быть отсортированы.
Комментарии:
1. тот факт, что не массивы явно не упорядочены, подразумевает, что массивы упорядочены.
2. Можно было бы предположить, что это да, однако это явно не указано, поэтому я был бы осторожен с этим. Было бы здорово, если бы это было упомянуто в документах.
Ответ №2:
Для простого способа получения объектов верхнего уровня в определенном порядке из JSON.stringify() вы можете использовать:
const str = JSON.stringify(obj, Object.keys(obj).sort());
Порядок ключей [], переданных в качестве replacer
, определяет порядок в результирующей строке.
Смотрите: https://dev.to/sidvishnoi/comment/gp71 и «сортировать свойства объекта и JSON.stringify» — https://www.tfzx.net/article/499097.html
Другой, более строгий подход: https://github.com/develohpanda/json-order
И:https://www.npmjs.com/package/fast-json-stable-stringify будет выводиться в порядке ключей. Вы также можете использовать свою собственную функцию сортировки.
Я нашел это после долгих поисков в Google.
Комментарии:
1. Это НЕ приведет к сортировке ключей вложенных объектов — об этом следует помнить.
Ответ №3:
Вы можете сортировать массивы с помощью метода сортировки.
И да, stringify сохраняет порядок.
var cars = ["Saab", "Volvo", "BMW"];
cars.push("ferrari");
alert(JSON.stringify(cars));
cars.sort();
alert("sorted cars" JSON.stringify(cars));
Комментарии:
1. По моему опыту, JSON.stringify иногда изменяет порядок элементов в массиве.
2. Это сортировка в зависимости от длины ключа. Я использую chrome. Я думаю, нет способа отсортировать массив объектов на основе ключей.
3. @UzumakiNaruto нет, это совпадение. Это сортировка по порядку ASCII. При этом все прописные буквы идут перед строчными буквами. Попробуйте изменить «ferrari» на просто «ferr» или изменить «Volvo» на «Bolvo», чтобы увидеть разницу в поведении.