„JavaScript“ objektų masyvo rūšiavimas

Aš perskaičiau šiuos objektus, naudodamas „Ajax“, ir saugojau juos masyve:

 var homes = [ { "h_id": "3", "city": "Dallas", "state": "TX", "zip": "75201", "price": "162500" }, { "h_id": "4", "city": "Bevery Hills", "state": "CA", "zip": "90210", "price": "319250" }, { "h_id": "5", "city": "New York", "state": "NY", "zip": "00010", "price": "962500" } ]; 

Kaip sukurti funkciją, kuri leistų rūšiuoti objektus, naudodama price nuosavybę didėjančia tvarka arba naudojant tik „JavaScript“?

1090
11 июня '09 в 6:59 2009-06-11 06:59 TomHankers paprašė birželio 11 d., 09:59, 2009-06-11 06:59
@ 26 atsakymai

Rūšiuoti namus pagal kainą didėjimo tvarka:

 homes.sort((a, b) => parseFloat(a.price) - parseFloat(b.price)); 

Kai kuriuos dokumentus galima rasti čia .

1392
11 июня '09 в 7:12 2009-06-11 07:12 atsakymą pateikė Stoboras birželio 11 d., 07:12, 2009-06-11 07:12

Čia yra lankstesnė versija, leidžianti bet kokiame lauke sukurti pakartotinai naudojamas rūšiavimo ir rūšiavimo funkcijas.

 var sort_by = function(field, reverse, primer){ var key = primer ? function(x) {return primer(x[field])} : function(x) {return x[field]}; reverse = !reverse ? 1 : -1; return function (a, b) { return a = key(a), b = key(b), reverse * ((a > b) - (b > a)); } } 

Dabar galite rūšiuoti pagal bet kurį lauką kaip pageidaujama

 var homes = [{ "h_id": "3", "city": "Dallas", "state": "TX", "zip": "75201", "price": "162500" }, { "h_id": "4", "city": "Bevery Hills", "state": "CA", "zip": "90210", "price": "319250" }, { "h_id": "5", "city": "New York", "state": "NY", "zip": "00010", "price": "962500" }]; // Sort by price high to low homes.sort(sort_by('price', true, parseInt)); // Sort by city, case-insensitive, AZ homes.sort(sort_by('city', false, function(a){return a.toUpperCase()})); 
635
11 июня '09 в 7:33 2009-06-11 07:33 Atsakymą pateikė Triptikas birželio 11 d., 07:33, 2009-06-11 07:33

Jei norite rūšiuoti, turite sukurti palyginimo funkciją naudodami du argumentus. Tada skambinkite rūšiavimo funkcijai naudodami šią lyginamąją funkciją taip:

128
11 июня '09 в 7:11 2009-06-11 07:11 atsakymą pateikė Ricardo Marimon birželio 11 d., 07:11, 2009-06-11 07:11

rūšiuoti eilutes, jei to reikia,

 var dataArr = { "hello": [{ "id": 114, "keyword": "zzzzzz", "region": "Sri Lanka", "supportGroup": "administrators", "category": "Category2" }, { "id": 115, "keyword": "aaaaa", "region": "Japan", "supportGroup": "developers", "category": "Category2" }] }; var sortArray = dataArr['hello']; sortArray.sort(function(a,b) { if ( a.region < b.region ) return -1; if ( a.region > b.region ) return 1; return 0; } ); 
39
14 нояб. Atsakymas duotas Ishan Liyanage lapkričio 14 d. 2013-11-14 08:55 '13, 8:55, 2013-11-14 08:55

Jei turite ES6 suderinamą naršyklę, galite naudoti:

Skirtumas tarp rūšiavimo tvarkos didėjimo ir mažėjimo tvarka yra palyginimo funkcijos grąžintos vertės ženklas:

 var ascending = homes.sort((a, b) => Number(a.price) - Number(b.price)); var descending = homes.sort((a, b) => Number(b.price) - Number(a.price)); 

Čia yra darbo kodo fragmentas:

28
25 нояб. Atsakymas pateikiamas Stephen Quan 25 lapkričio. 2016-11-25 04:02 '16 at 4:02 am 2016-11-25 04:02

Jūs norite rūšiuoti jį javascript, tiesa? Norite sort() funkciją . Tokiu atveju jums reikia parašyti lyginamąją funkciją ir perduoti ją sort() , kažką panašaus į:

 function comparator(a, b) { return parseInt(a["price"], 10) - parseInt(b["price"], 10); } var json = { "homes": [  ] }; console.log(json["homes"].sort(comparator)); 

Jūsų palygintojas priima vieną iš kiekvienos įdėtos skydo masyvo viduje ir nusprendžia, kuris iš jų yra didesnis, patikrinant kainų lauką.

22
11 июня '09 в 7:14 2009-06-11 07:14 atsakė Tim Gilbert , birželio 11 d., 07:14, 2009-06-11 07:14

Aš rekomenduoju GitHub: Array sortBy - geriausias „ sortBy metodo, kuris naudoja „Schwartz“ transformaciją, įgyvendinimas

Bet dabar mes stengsimės naudoti šį „ Gist“ metodą : sortBy-old.js .
Kurkime masyvų, kurie gali rūšiuoti objektus pagal tam tikrą turtą, rūšiavimo būdą.

Rūšiavimo funkcijos kūrimas

 var data = [ {date: "2011-11-14T16:30:43Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T17:22:59Z", quantity: 2, total: 90, tip: 0, type: "Tab"}, {date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"}, {date: "2011-11-14T16:53:41Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T16:48:46Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0, type: "cash"}, {date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa"}, {date: "2011-11-14T16:58:03Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"}, {date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"}, {date: "2011-11-14T17:07:21Z", quantity: 2, total: 90, tip: 0, type: "tab"}, {date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "Cash"} ]; 

Naudokite jį

Rūšiuoti masyvą pagal "date" kaip String

 // sort by @type (ascending) IGNORING case-sensitive sortBy(data, { prop: "type", parser: (t) => t.toUpperCase() }); // expected: first element // { date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "Cash" } // expected: last element // { date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa" } 

Jei norite konvertuoti "date" lauką į Date tipą:

jsbin.com/lesebi 

@Ozesh “ dėka savo atsiliepimuose buvo nustatyta problema, susijusi su netikrų verčių savybėmis.

20
05 нояб. atsakymas duotas jherax 05 lapkričio. 2014-11-05 19:28 '14 19:28 2014-11-05 19:28

Naudokite lodash.sortBy (naudodami paprastuosius, taip pat galite tiesiog įterpti scenarijų , į kurį pridėta cdn , HTML viršuje)

 var sortBy = require('lodash.sortby'); // or sortBy = require('lodash').sortBy; 

Mažėjantis

 var descendingOrder = sortBy( homes, 'price' ).reverse(); 

Didėjimo tvarka

 var ascendingOrder = sortBy( homes, 'price' ); 
16
25 мая '16 в 17:53 2016-05-25 17:53 atsakymą pateikė Evan Carroll , gegužės 25 d. 16, 17:53 2016-05-25 17:53

Tai galima pasiekti naudojant paprastą rūšiavimo funkciją () . Norėdami pamatyti demonstraciją, atlikite toliau pateiktą kodo fragmentą.

7
06 авг. atsakymą pateikė Ajay Singh 06 rug. 2017-08-06 20:53 '17, 8:53 pm 2017-08-06 20:53

Galite naudoti „JavaScript“ sort metodą su atgalinio ryšio funkcija:

 function compareASC(homeA, homeB) { return parseFloat(homeA.price) - parseFloat(homeB.price); } function compareDESC(homeA, homeB) { return parseFloat(homeB.price) - parseFloat(homeA.price); } // Sort ASC homes.sort(compareASC); // Sort DESC homes.sort(compareDESC); 
3
11 июня '09 в 7:14 2009-06-11 07:14 atsakymą pateikė John G birželio 11 d., 07:14, 2009-06-11 07:14

Čia yra visų aukščiau pateiktų atsakymų kulminacija.

Patvirtinimas: http://jsfiddle.net/bobberino/4qqk3/

 var sortOn = function (arr, prop, reverse, numeric) { // Ensure there a property if (!prop || !arr) { return arr } // Set up sort function var sort_by = function (field, rev, primer) { // Return the required a,b function return function (a, b) { // Reset a, b to the field a = primer(a[field]), b = primer(b[field]); // Do actual sorting, reverse as needed return ((a < b) ? -1 : ((a > b) ? 1 : 0)) * (rev ? -1 : 1); } } // Distinguish between numeric and string to prevent 100 from coming before smaller // eg // 1 // 20 // 3 // 4000 // 50 if (numeric) { // Do sort "in place" with sort_by function arr.sort(sort_by(prop, reverse, function (a) { // - Force value to a string. // - Replace any non numeric characters. // - Parse as float to allow 0.02 values. return parseFloat(String(a).replace(/[^0-9.-]+/g, '')); })); } else { // Do sort "in place" with sort_by function arr.sort(sort_by(prop, reverse, function (a) { // - Force value to string. return String(a).toUpperCase(); })); } } 
3
28 янв. atsakymas duotas ant 28 m. 2014-01-28 10:15 '14, 10:15 2014-01-28 10:15

Jei naudojate „ Underscore.js“ , pabandykite rūšiuoti:

 // price is of an integer type _.sortBy(homes, "price"); // price is of a string type _.sortBy(homes, function(home) {return parseInt(home.price);}); 
3
06 мая '15 в 4:41 2015-05-06 04:41 atsakymas pateikiamas Vitalii Fedorenko 06 gegužės 15 d. 4:41 2015-05-06 04:41

Aš taip pat dirbau su tam tikru reitingu ir keliais rūšiavimo laukais:

 arr = [ {type:'C', note:834}, {type:'D', note:732}, {type:'D', note:008}, {type:'F', note:474}, {type:'P', note:283}, {type:'P', note:165}, {type:'X', note:173}, {type:'Z', note:239}, ]; arr.sort(function(a,b){ var _a = ((a.type==='C')?'0':(a.type==='P')?'1':'2'); _a += (a.type.localeCompare(b.type)===-1)?'0':'1'; _a += (a.note>b.note)?'1':'0'; var _b = ((b.type==='C')?'0':(b.type==='P')?'1':'2'); _b += (b.type.localeCompare(a.type)===-1)?'0':'1'; _b += (b.note>a.note)?'1':'0'; return parseInt(_a) - parseInt(_b); }); 

Rezultatas

 [ {"type":"C","note":834}, {"type":"P","note":165}, {"type":"P","note":283}, {"type":"D","note":8}, {"type":"D","note":732}, {"type":"F","note":474}, {"type":"X","note":173}, {"type":"Z","note":239} ] 
3
02 сент. Rodolfo Jorge Nemer Nogueira atsakymas 2014-09-02 16:44 '14 ne 16:44 2014-09-02 16:44

Nors tai yra per daug surūšiuoti tik vieną masyvą, ši prototipo funkcija leidžia rūšiuoti „Javascript“ matricas pagal bet kurį raktą didėjimo arba mažėjimo tvarka , įskaitant įdėtus raktus , naudojant dot .

 (function(){ var keyPaths = []; var saveKeyPath = function(path) { keyPaths.push({ sign: (path[0] === '+' || path[0] === '-')? parseInt(path.shift()+1) : 1, path: path }); }; var valueOf = function(object, path) { var ptr = object; for (var i=0,l=path.length; i<l; i++) ptr = ptr[path[i]]; return ptr; }; var comparer = function(a, b) { for (var i = 0, l = keyPaths.length; i < l; i++) { aVal = valueOf(a, keyPaths[i].path); bVal = valueOf(b, keyPaths[i].path); if (aVal > bVal) return keyPaths[i].sign; if (aVal < bVal) return -keyPaths[i].sign; } return 0; }; Array.prototype.sortBy = function() { keyPaths = []; for (var i=0,l=arguments.length; i<l; i++) { switch (typeof(arguments[i])) { case "object": saveKeyPath(arguments[i]); break; case "string": saveKeyPath(arguments[i].match(/[+-]|[^.]+/g)); break; } } return this.sort(comparer); }; })(); 

Naudoti:

 var data = [ { name: { first: 'Josh', last: 'Jones' }, age: 30 }, { name: { first: 'Carlos', last: 'Jacques' }, age: 19 }, { name: { first: 'Carlos', last: 'Dante' }, age: 23 }, { name: { first: 'Tim', last: 'Marley' }, age: 9 }, { name: { first: 'Courtney', last: 'Smith' }, age: 27 }, { name: { first: 'Bob', last: 'Smith' }, age: 30 } ] data.sortBy('age'); // "Tim Marley(9)", "Carlos Jacques(19)", "Carlos Dante(23)", "Courtney Smith(27)", "Josh Jones(30)", "Bob Smith(30)" 

Rūšiuoti pagal įdėtąsias savybes naudojant taškų sintaksę arba masyvo sintaksę:

 data.sortBy('name.first'); // "Bob Smith(30)", "Carlos Dante(23)", "Carlos Jacques(19)", "Courtney Smith(27)", "Josh Jones(30)", "Tim Marley(9)" data.sortBy(['name', 'first']); // "Bob Smith(30)", "Carlos Dante(23)", "Carlos Jacques(19)", "Courtney Smith(27)", "Josh Jones(30)", "Tim Marley(9)" 

Rūšiuoti pagal keletą raktų:

 data.sortBy('name.first', 'age'); // "Bob Smith(30)", "Carlos Jacques(19)", "Carlos Dante(23)", "Courtney Smith(27)", "Josh Jones(30)", "Tim Marley(9)" data.sortBy('name.first', '-age'); // "Bob Smith(30)", "Carlos Dante(23)", "Carlos Jacques(19)", "Courtney Smith(27)", "Josh Jones(30)", "Tim Marley(9)" 

Galite atrakinti repo: https://github.com/eneko/Array.sortBy

2
25 сент. atsakymas, kurį pateikė Eneko Alonso 25 sep. 2015-09-25 05:37 '15 , 5:37 2015-09-25 05:37

Normaliai elementų reikšmių grupei:

 function sortArrayOfElements(arrayToSort) { function compareElements(a, b) { if (a < b) return -1; if (a > b) return 1; return 0; } return arrayToSort.sort(compareElements); } eg 1: var array1 = [1,2,545,676,64,2,24] output : [1, 2, 2, 24, 64, 545, 676] var array2 = ["v","a",545,676,64,2,"24"] output: ["a", "v", 2, "24", 64, 545, 676] 

Objektų masyvui:

 function sortArrayOfObjects(arrayToSort, key) { function compareObjects(a, b) { if (a[key] < b[key]) return -1; if (a[key] > b[key]) return 1; return 0; } return arrayToSort.sort(compareObjects); } eg 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}] output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}] 
2
07 февр. atsakymas duotas Umesh 07 vasaris . 2018-02-07 14:08 '18, 14:08 val. 2018-02-07 14:08
2
12 июля '11 в 17:59 2011-07-12 17:59 Atsakymą pateikė TheEmirOfGroofunkistan, liepos 12 d., 11 val., 17:59, 2011-07-12 17:59

Jums reikės dviejų funkcijų.

 function desc(a, b) { return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; } function asc(a, b) { return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; } 

Tada galite tai taikyti bet kuriam objektui:

  data.sort((a, b) => desc(parseFloat(a.price), parseFloat(b.price))); 

1
07 марта '18 в 10:13 2018-03-07 10:13 OzzyCzech atsakymą pateikė kovo 18 d. 18 val. 10:13 2018-03-07 10:13

Štai šiek tiek pakeista elegantiško įgyvendinimo iš knygos „JavaScript: geros detalės“ versija.

PASTABA . Ši versija yra stabili . Jis išsaugo pirmos klasės tvarką, atlikdamas sekančią grandinės rūšiavimą.

Prie jo isAscending parametrą isAscending . Be to, jis buvo konvertuotas į ES6 standartus ir „naujas“ geras detales, kaip rekomendavo autorius.

Galite rūšiuoti didėjimo ir mažėjimo tvarka ir surūšiuoti grandinę pagal kelias savybes.

1
08 февр. Atsakymą pateikia mythicalcoder 08 Feb. 2017-02-08 00:39 '17 ne 0:39 2017-02-08 00:39

Su ECMAScript 6 atsakymu StoBor gali būti dar glaustesnis:

 homes.sort((a, b) => a.price - b.price) 
1
26 июля '16 в 11:43 2016-07-26 11:43 atsakymą pateikė CracyD, liepos 26 d., 16 d., 11:43, 2016-07-26 11:43

Norėdami surūšiuoti masyvą, turite nustatyti lyginamojo funkciją. Ši funkcija visada skirsis pagal pageidaujamą rūšiavimo modelį ar tvarką (ty didėjančia ar mažėjančia tvarka).

Kurkime keletą funkcijų, kurios rūšiuoja masyvą didėjančia ar mažėjančia tvarka, ir kurioje yra objektas arba eilutė arba skaitmeninės vertės.

 function sorterAscending(a,b) { return ab; } function sorterDescending(a,b) { return ba; } function sorterPriceAsc(a,b) { return parseInt(a['price']) - parseInt(b['price']); } function sorterPriceDes(a,b) { return parseInt(b['price']) - parseInt(b['price']); } 

Rūšiuoti numerius (abėcėlės tvarka ir didėjančia tvarka):

 var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); 

Rūšiuoti numerius (abėcėlės tvarka ir mažėjančia tvarka):

 var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); fruits.reverse(); 

Rūšiuoti numerius (skaitmeninius ir didėjančius):

 var points = [40,100,1,5,25,10]; points.sort(sorterAscending()); 

Rūšiuoti numerius (skaitmeninius ir mažėjančius):

 var points = [40,100,1,5,25,10]; points.sort(sorterDescending()); 

Kaip ir anksčiau, naudokite sorterPriceAsc ir sorterPriceDes metodus su savo masyvu su reikiamu raktu.

 homes.sort(sorterPriceAsc()) or homes.sort(sorterPriceDes()) 
1
06 дек. atsakymą pateikė Lalit Kumar 06 d. 2013-12-06 13:10 '13, 13:10, 2013-12-06 13:10

Neseniai parašiau universalią funkciją, kuri leistų jums tai valdyti, jei norite ją naudoti.

  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); } 
0
30 окт. Atsakymas pateikiamas Brad Bird 30 okt. 2014-10-30 13:28 '14, 13:28 2014-10-30 13:28

Rūšiuoti kelių masyvo objektų lauke. Įveskite savo lauko pavadinimą į arrprop masyvą, pavyzdžiui, ["a","b","c"] tada perkelkite antrąjį parametrą arrsource faktinį šaltinį, kurį norime rūšiuoti.

 function SortArrayobject(arrprop,arrsource){ arrprop.forEach(function(i){ arrsource.sort(function(a,b){ return ((a[i] < b[i]) ? -1 : ((a[i] > b[i]) ? 1 : 0)); }); }); return arrsource; } 
0
26 апр. Atsakyti Pradip Talaviya balandžio 26 2017-04-26 16:13 '17 at 4:13 pm 2017-04-26 16:13
 homes.sort(function(a, b){ var nameA=a.prices.toLowerCase(), nameB=b.prices.toLowerCase() if (nameA < nameB) //sort string ascending return -1 if (nameA > nameB) return 1 return 0 //default return value (no sorting) }) 
0
31 янв. Atsakymą pateikė user3346960 Jan 31 2015-01-31 04:55 '15 at 4:55 2015-01-31 04:55

Nors žinau, kad OP norėjo surūšiuoti skaičių numerius, šis klausimas buvo pažymėtas kaip atsakymas į panašius klausimus, susijusius su stygomis. Atsižvelgiant į tai, pirmiau minėti atsakymai nemano, kad teksto masyvas yra rūšiuojamas, kai korpusas yra svarbus. Dauguma atsakymų užima eilutės reikšmes ir paverčia jas didžiosiomis raidėmis / mažosiomis raidėmis, o tada jas rūšiuoja vienaip ar kitaip. Reikalavimai, kuriuos laikau, yra paprasti:

  • Rūšiuoti abėcėlės tvarka AZ
  • Viršutinės to paties žodžio reikšmės turi būti mažos
  • Tos pačios raidės (A / a, B / b) vertės turi būti sugrupuotos.

Tikiuosi, kad yra [ A, a, B, b, C, c ] bet atsakymai viršija A, B, C, a, b, c . Aš iš tikrųjų nulaužiau galvą ilgiau, nei norėjau (kodėl aš jį tikiuosi, kad tai padės bent vienam kitam asmeniui). Nors du naudotojai nurodo „ localeCompare funkciją pažymėto atsakymo komentaruose, tai nematau tol, kol per paieškos laikotarpį localeCompare šios funkcijos. Perskaičius String.prototype.localeCompare () dokumentaciją, galėjau pateikti:

Aš šiek tiek vėlu partijai, bet žemiau yra mano logika rūšiavimui.

 function getSortedData(data, prop, isAsc){ return data.sort((a, b)=>{ return (a[prop] < b[prob] ? -1: 1 ) * (isAsc ? 1 : -1) }); } 
0
24 янв. Atsakymas pateikiamas Santosh 24 d 2019-01-24 15:26 '19, 15:26 pm 2019-01-24 15:26

Kiti klausimai apie „ žymų arba Užduoti klausimą