Сортировка JSON по значениям
у меня есть очень простой объект JSON, как показано ниже:
{
"people":[
{
"f_name":"john",
"l_name":"doe",
"sequence":"0",
"title":"president",
"url":"google.com",
"color":"333333"
},
{
"f_name":"michael",
"l_name":"goodyear",
"sequence":"0",
"title":"general manager",
"url":"google.com",
"color":"333333"
}
]
}
теперь, когда это возвращается из моего кода на стороне сервера, я запускаю jQuery.each
сформировать необходимый html и вывести результат.
прямо сейчас я отправляю вызов AJAX на сервер, содержащий мою информацию о сортировке... например, "Title DESC" и повторно запустите SQL-запрос, чтобы вернуть новый результирующий набор. Но я хочу избежать этого и использовать jQuery для сортировки результирующего JSON, чтобы предотвратить обращения к серверу, и множественный доступ к базе данных.
Как я могу достичь этого с помощью jQuery?
6 ответов:
попробуйте это для элегантности и эффективности.
jQuery в порядке, но он не идеально подходит для сортировки здесь, Если у вас нет исходного массива под рукой. Просто напишите функцию, которая принимает имя свойства как строку и порядок (по возрастанию или по убыванию) как логическое значение, напишите простую функцию сравнения и используйте собственную функцию JS sort (). Таким образом, вам не нужно писать отдельную функцию сортировки для каждого свойство:
var people = [ { "f_name": "john", "l_name": "doe", "sequence": "0", "title" : "president", "url" : "google.com", "color" : "333333", } // etc ]; function sortResults(prop, asc) { people = people.sort(function(a, b) { if (asc) { return (a[prop] > b[prop]) ? 1 : ((a[prop] < b[prop]) ? -1 : 0); } else { return (b[prop] > a[prop]) ? 1 : ((b[prop] < a[prop]) ? -1 : 0); } }); showResults(); }
затем:
sortResults('l_name', true);
играть с рабочим примером здесь.
демо: http://jsfiddle.net/VAKrE/1019/
успешно передать равные значения (сохранить тот же порядок). Гибкий: ручка Асцендент (123) или потомок (321), работает для чисел, букв и уникодов. Работает на всех тестируемых устройствах (Chrome, Android default browser, FF).
данные такие:
var people = [ { 'myKey': 'A', 'status': 0 }, { 'myKey': 'B', 'status': 3 }, { 'myKey': 'C', 'status': 3 }, { 'myKey': 'D', 'status': 2 }, { 'myKey': 'E', 'status': 7 }, ... ];
сортировка по возрастанию или в обратном порядке:
function sortJSON(data, key, way) { return data.sort(function(a, b) { var x = a[key]; var y = b[key]; if (way === '123' ) { return ((x < y) ? -1 : ((x > y) ? 1 : 0)); } if (way === '321') { return ((x > y) ? -1 : ((x < y) ? 1 : 0)); } }); } people2 = sortJSON(people,'status', '321'); // 123 or 321 alert("2. After processing (0 to x if 123; x to 0 if 321): "+JSON.stringify(people2));
jQuery.fn.sort = function() { return this.pushStack( [].sort.apply( this, arguments ), []); }; function sortLastName(a,b){ if (a.l_name == b.l_name){ return 0; } return a.l_name> b.l_name ? 1 : -1; }; function sortLastNameDesc(a,b){ return sortLastName(a,b) * -1; }; var people= [ { "f_name": "john", "l_name": "doe", "sequence": "0", "title" : "president", "url" : "google.com", "color" : "333333", }, { "f_name": "michael", "l_name": "goodyear", "sequence": "0", "title" : "general manager", "url" : "google.com", "color" : "333333", }] sorted=$(people).sort(sortLastNameDesc);
Если вы не возражаете, используя внешнюю библиотеку, Лодашь есть много замечательных утилит
var people = [ { "f_name":"john", "l_name":"doe", "sequence":"0", "title":"president", "url":"google.com", "color":"333333" }, { "f_name":"michael", "l_name":"goodyear", "sequence":"0", "title":"general manager", "url":"google.com", "color":"333333" } ]; var sorted = _.sortBy(people, "l_name")
вы также можете сортировать по нескольким свойствам. здесь Планк показывает его в действии
решение работает с разными типами и с верхними и нижними случаями.
например, безtoLowerCase
утверждение, " Goodyear "придет перед" doe " с восходящим видом. Запустите фрагмент кода в нижней части моего ответа, чтобы просмотреть различные варианты поведения.ДАННЫЕ JSON:
var people = [ { "f_name" : "john", "l_name" : "doe", // lower case "sequence": 0 // int }, { "f_name" : "michael", "l_name" : "Goodyear", // upper case "sequence" : 1 // int }];
функция сортировки JSON:
function sortJson(element, prop, propType, asc) { switch (propType) { case "int": element = element.sort(function (a, b) { if (asc) { return (parseInt(a[prop]) > parseInt(b[prop])) ? 1 : ((parseInt(a[prop]) < parseInt(b[prop])) ? -1 : 0); } else { return (parseInt(b[prop]) > parseInt(a[prop])) ? 1 : ((parseInt(b[prop]) < parseInt(a[prop])) ? -1 : 0); } }); break; default: element = element.sort(function (a, b) { if (asc) { return (a[prop].toLowerCase() > b[prop].toLowerCase()) ? 1 : ((a[prop].toLowerCase() < b[prop].toLowerCase()) ? -1 : 0); } else { return (b[prop].toLowerCase() > a[prop].toLowerCase()) ? 1 : ((b[prop].toLowerCase() < a[prop].toLowerCase()) ? -1 : 0); } }); } }
использование:
sortJson(people , "l_name", "string", true); sortJson(people , "sequence", "int", true);
var people = [{ "f_name": "john", "l_name": "doe", "sequence": 0 }, { "f_name": "michael", "l_name": "Goodyear", "sequence": 1 }, { "f_name": "bill", "l_name": "Johnson", "sequence": 4 }, { "f_name": "will", "l_name": "malone", "sequence": 2 }, { "f_name": "tim", "l_name": "Allen", "sequence": 3 }]; function sortJsonLcase(element, prop, asc) { element = element.sort(function(a, b) { if (asc) { return (a[prop] > b[prop]) ? 1 : ((a[prop] < b[prop]) ? -1 : 0); } else { return (b[prop] > a[prop]) ? 1 : ((b[prop] < a[prop]) ? -1 : 0); } }); } function sortJson(element, prop, propType, asc) { switch (propType) { case "int": element = element.sort(function(a, b) { if (asc) { return (parseInt(a[prop]) > parseInt(b[prop])) ? 1 : ((parseInt(a[prop]) < parseInt(b[prop])) ? -1 : 0); } else { return (parseInt(b[prop]) > parseInt(a[prop])) ? 1 : ((parseInt(b[prop]) < parseInt(a[prop])) ? -1 : 0); } }); break; default: element = element.sort(function(a, b) { if (asc) { return (a[prop].toLowerCase() > b[prop].toLowerCase()) ? 1 : ((a[prop].toLowerCase() < b[prop].toLowerCase()) ? -1 : 0); } else { return (b[prop].toLowerCase() > a[prop].toLowerCase()) ? 1 : ((b[prop].toLowerCase() < a[prop].toLowerCase()) ? -1 : 0); } }); } } function sortJsonString() { sortJson(people, 'l_name', 'string', $("#chkAscString").prop("checked")); display(); } function sortJsonInt() { sortJson(people, 'sequence', 'int', $("#chkAscInt").prop("checked")); display(); } function sortJsonUL() { sortJsonLcase(people, 'l_name', $('#chkAsc').prop('checked')); display(); } function display() { $("#data").empty(); $(people).each(function() { $("#data").append("<div class='people'>" + this.l_name + "</div><div class='people'>" + this.f_name + "</div><div class='people'>" + this.sequence + "</div><br />"); }); }
body { font-family: Arial; } .people { display: inline-block; width: 100px; border: 1px dotted black; padding: 5px; margin: 5px; } .buttons { border: 1px solid black; padding: 5px; margin: 5px; float: left; width: 20%; } ul { margin: 5px 0px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="buttons" style="background-color: rgba(240, 255, 189, 1);"> Sort the JSON array <strong style="color: red;">with</strong> toLowerCase: <ul> <li>Type: string</li> <li>Property: lastname</li> </ul> <button onclick="sortJsonString(); return false;">Sort JSON</button> Asc Sort <input id="chkAscString" type="checkbox" checked="checked" /> </div> <div class="buttons" style="background-color: rgba(255, 214, 215, 1);"> Sort the JSON array <strong style="color: red;">without</strong> toLowerCase: <ul> <li>Type: string</li> <li>Property: lastname</li> </ul> <button onclick="sortJsonUL(); return false;">Sort JSON</button> Asc Sort <input id="chkAsc" type="checkbox" checked="checked" /> </div> <div class="buttons" style="background-color: rgba(240, 255, 189, 1);"> Sort the JSON array: <ul> <li>Type: int</li> <li>Property: sequence</li> </ul> <button onclick="sortJsonInt(); return false;">Sort JSON</button> Asc Sort <input id="chkAscInt" type="checkbox" checked="checked" /> </div> <br /> <br /> <div id="data" style="float: left; border: 1px solid black; width: 60%; margin: 5px;">Data</div>
вот многоуровневый метод сортировки. Я включаю фрагмент из углового модуля JS, но вы можете выполнить то же самое, определив объекты ключей сортировки таким образом, чтобы ваша функция сортировки имела к ним доступ. Вы можете увидеть полный модуль на Plunker.
$scope.sortMyData = function (a, b) { var retVal = 0, key; for (var i = 0; i < $scope.sortKeys.length; i++) { if (retVal !== 0) { break; } else { key = $scope.sortKeys[i]; if ('asc' === key.direction) { retVal = (a[key.field] < b[key.field]) ? -1 : (a[key.field] > b[key.field]) ? 1 : 0; } else { retVal = (a[key.field] < b[key.field]) ? 1 : (a[key.field] > b[key.field]) ? -1 : 0; } } } return retVal; };