Как сортировать объект JS объектов?
Я построил объект в PHP, использовал функцию JSON_encode и отправил его как строку JSON в мой JS-скрипт через ajax. Затем я преобразую его обратно в объект. Проблема в том, что я хотел сохранить объект в том порядке, в котором он был первоначально создан. Пожалуйста, посмотрите эту картину того, как выглядит объект, как только я получу его в JS:
когда я создал объект, он был отсортирован по полю customer в алфавитном порядке. Запуск имени клиента с A придет первым, B вторым и т. д. Как вы можете видеть, теперь первый элемент объекта как клиент, начинающийся с S. Похоже, он каким-то образом автоматически сортировался по ключу объекта верхнего уровня, который является целым числом, поэтому я понимаю, почему это произошло.
поэтому я хочу сделать, это повторно отсортировать этот объект, чтобы все подобъекты были отсортированы по customer
поле в алфавитном порядке. Возможно ли это? Если да, то как мне это сделать?
спасибо!
4 ответов
вероятно, это разница между объектом JavaScript и массивом JavaScript. Объекты больше похожи на хэш-таблицы, где ключи не сортируются в определенном порядке, тогда как массивы-это линейные коллекции значений.
в задней части убедитесь, что вы кодируете массив, а не объект. Проверьте окончательный кодированный JSON, и если ваша коллекция объектов окружена {} вместо [], она кодируется как объект вместо массива.
вы может возникнуть проблема, так как похоже, что вы пытаетесь получить доступ к объектам по идентификационному номеру, и это индекс, который вы хотите, чтобы эти объекты занимали в конечном массиве, что представляет собой еще одну проблему, потому что вы, вероятно, не хотите массив с 40 000 записей, Когда вы храните только небольшое количество значений.
Если вы просто хотите перебирать объекты, вы должны убедиться, что кодируете массив вместо объекта. Если вы хотите получить доступ к объектам по определенному ID, вероятно, вам придется сортировать объекты на стороне клиента (т. е. иметь объект из ответа JSON, а затем создать другой массив и отсортировать эти объекты в него, чтобы вы могли иметь отсортированные объекты и все еще иметь доступ к ним по идентификатору).
вы можете легко найти эффективные алгоритмы сортировки (или использовать один ниже от ELCas) через Google.
Я изменил Fabricio Matée ответ, чтобы стать более гибким и вернуть отсортированный объект.
function alphabetical_sort_object_of_objects(data, attr) {
var arr = [];
for (var prop in data) {
if (data.hasOwnProperty(prop)) {
var obj = {};
obj[prop] = data[prop];
obj.tempSortName = data[prop][attr].toLowerCase();
arr.push(obj);
}
}
arr.sort(function(a, b) {
var at = a.tempSortName,
bt = b.tempSortName;
return at > bt ? 1 : ( at < bt ? -1 : 0 );
});
var result = [];
for (var i=0, l=arr.length; i<l; i++) {
var obj = arr[i];
delete obj.tempSortName;
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
var id = prop;
}
}
var item = obj[id];
result.push(item);
}
return result;
}
тогда просто вызовите функцию следующим образом
your_object = alphabetical_sort_object_of_objects(your_object, 'attribute_to_sort');
вот универсальная функция итерации, которая толкает все объекты в массив и сортирует их по их customer
свойство без учета регистра, затем выполняет итерацию по отсортированному массиву:
function iterate(data) {
var arr = [];
for (var prop in data) {
if (data.hasOwnProperty(prop)) {
var obj = {};
obj[prop] = data[prop];
obj.tempSortName = data[prop].customer.toLowerCase();
arr.push(obj);
}
}
arr.sort(function(a, b) {
var at = a.tempSortName,
bt = b.tempSortName;
return at > bt ? 1 : ( at < bt ? -1 : 0 );
});
for (var i = 0, l = arr.length; i < l; i++) {
var obj = arr[i];
delete obj.tempSortName;
console.log(obj);
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
var id = prop; //gets the obj "index" (id?)
}
}
console.log(id);
var item = obj[id];
console.log(item.customer);
//do stuff with item
}
}
просто цикл через ваши данные и сортировать. Я не использую самый эффективный сортировщик, но идеи есть.
var data = toArray(AJAX_Returned_JSON); // function to convert object to array
var sortedData = null;
for(var i=0; i<data.length - 1; i++){
var temp = data[i];
for(var j=i+1; j<data.length; j++){
if(data[j].customer < temp.customer){
temp = data[j];
}
}
sortedData.push(temp);
}