දේපල වටිනාකම අනුව වස්තු පෙළ වර්ග කරන්න


2772

මට ජාවාස්ක්‍රිප්ට් වස්තු සමූහයක් ඇත:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

last_nomජාවාස්ක්‍රිප්ට් හි වටිනාකම අනුව ඒවා වර්ග කරන්නේ කෙසේද ?

මම දනිමි sort(a,b), නමුත් එය ක්‍රියා කරන්නේ නූල් සහ සංඛ්‍යා මත පමණි. toString()මගේ වස්තූන් සඳහා ක්‍රමවේදයක් එක් කිරීමට මට අවශ්‍යද?


7
මෙම ස්ක්‍රිප්ට් මඟින් ඔබට ඔබේම සංසන්දනාත්මක ශ්‍රිතයක් හෝ වර්ගයක්
Baversjo

ඉක්මන්ම ක්‍රමය නම් ඕනෑම ආකාරයක ආදාන, ගණනය කළ ක්ෂේත්‍ර සහ අභිරුචි වර්ග කිරීමේ ඇණවුම් සඳහා සහය දක්වන බ්‍රව්සරයේ සහ නෝඩ් දෙකෙහිම ස්වදේශීයව ක්‍රියා කරන සමාවයවික වර්ග කිරීමේ අරාව මොඩියුලය භාවිතා කිරීමයි .
ලොයිඩ්

Answers:


3936

ඔබේම සංසන්දනාත්මක ශ්‍රිතයක් ලිවීමට තරම් පහසුය:

function compare( a, b ) {
  if ( a.last_nom < b.last_nom ){
    return -1;
  }
  if ( a.last_nom > b.last_nom ){
    return 1;
  }
  return 0;
}

objs.sort( compare );

හෝ පේළියේ (c / o මාර්කෝ ඩෙමෙයෝ):

objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0)); 

442
හෝ ඉන්ලයින්: objs.sort (ශ්‍රිතය (a, b) {ආපසු (a.last_nom> b.last_nom)? 1: ((b.last_nom> a.last_nom)? -1: 0);});
මාකෝ ඩෙමියෝ


177
return a.last_nom.localeCompare(b.last_nom)වැඩ කරයි.
සර්බ්‍රස්

146
ක්ෂේත්‍රය සංඛ්‍යාත්මක වන වර්ගයක් සොයන අය සඳහා, සැසඳීමේ ශ්‍රිතය: return a.value - b.value;(ASC)
ඇන්ඩ්‍රේ ෆිගියිරෙඩෝ

20
localeCompareවිදේශීය භාෂාවලින් උච්චාරණය කරන ලද අක්ෂර භාවිතා කිරීමේදී සර්බ්‍රස් වැදගත් වන අතර වඩාත් අලංකාර වේ.
මාකෝස් ලීමා

842

ඔබ සමත් වන අගය අනුව වස්තු වර්ග කරන ගතික වර්ගීකරණ ශ්‍රිතයක් ද ඔබට නිර්මාණය කළ හැකිය:

function dynamicSort(property) {
    var sortOrder = 1;
    if(property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a,b) {
        /* next line works with strings and numbers, 
         * and you may want to customize it to your needs
         */
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}

එබැවින් ඔබට මෙවැනි වස්තු සමූහයක් තිබිය හැකිය:

var People = [
    {Name: "Name", Surname: "Surname"},
    {Name:"AAA", Surname:"ZZZ"},
    {Name: "Name", Surname: "AAA"}
];

... ඔබ කරන විට එය ක්‍රියාත්මක වනු ඇත:

People.sort(dynamicSort("Name"));
People.sort(dynamicSort("Surname"));
People.sort(dynamicSort("-Surname"));

ඇත්තටම මෙය දැනටමත් ප්‍රශ්නයට පිළිතුරු සපයයි. පහත කොටස ලියා ඇත්තේ බොහෝ අය මාව සම්බන්ධ කර ගත් නිසා එය බහු පරාමිතීන් සමඟ ක්‍රියා නොකරන බවට පැමිණිලි කරමිනි .

බහු පරාමිතීන්

බහුවිධ වර්ග පරාමිතීන් සමඟ වර්ග කිරීමේ ශ්‍රිත ජනනය කිරීමට ඔබට පහත ශ්‍රිතය භාවිතා කළ හැකිය.

function dynamicSortMultiple() {
    /*
     * save the arguments object as it will be overwritten
     * note that arguments object is an array-like object
     * consisting of the names of the properties to sort by
     */
    var props = arguments;
    return function (obj1, obj2) {
        var i = 0, result = 0, numberOfProperties = props.length;
        /* try getting a different result from 0 (equal)
         * as long as we have extra properties to compare
         */
        while(result === 0 && i < numberOfProperties) {
            result = dynamicSort(props[i])(obj1, obj2);
            i++;
        }
        return result;
    }
}

එමඟින් ඔබට මෙවැනි දෙයක් කිරීමට හැකි වේ:

People.sort(dynamicSortMultiple("Name", "-Surname"));

උප පංති අරා

දේශීය වස්තූන් විස්තාරණය කිරීමට ඉඩ සලසන ES6 භාවිතා කළ හැකි වාසනාවන්තයින් සඳහා:

class MyArray extends Array {
    sortBy(...args) {
        return this.sort(dynamicSortMultiple.apply(null, args));
    }
}

එමඟින් මෙය සක්‍රීය වනු ඇත:

MyArray.from(People).sortBy("Name", "-Surname");

ජාවාස්ක්‍රිප්ට් හි දේපල නම් ඕනෑම නූලක් විය හැකි බව කරුණාවෙන් සලකන්න. ඔබට "-" වලින් ආරම්භ වන ගුණාංග තිබේ නම් (අතිශයින්ම අපහසු සහ බොහෝ විට හොඳ අදහසක් නොවේ), ප්‍රතිලෝම වර්ග කිරීමක් ලෙස වෙනත් දෙයක් භාවිතා කිරීම සඳහා ඔබට ගතිකසෝර්ට් ශ්‍රිතය වෙනස් කිරීමට අවශ්‍ය වනු ඇත. දර්ශකය.
Ege Özcan

dynamicSort()ඉහත උදාහරණයේ ලොකු අකුරු කුඩා අකුරු වලට වඩා ඉදිරියෙන් තබන බව මම දුටුවෙමි . උදාහරණයක් ලෙස, මම වටිනාකම් ඇති නම් APd, Aklinසහ Abe- ක ආරෝ ආකාරයක ප්රතිඵල විය යුතු Abe, Aklin, APd. එහෙත්, ඔබේ ආදර්ශය, මෙම ප්රතිඵලය APd, Abe, Aklin. කෙසේ හෝ මෙම හැසිරීම නිවැරදි කිරීමට?
ලොයිඩ් බැංකු

6
@ ලොයිඩ්බෑන්ක්ස් ඔබ මෙය නූල් සඳහා දැඩි ලෙස භාවිතා කරන්නේ නම්, ඒ var result = a[property].localeCompare(b[property]);වෙනුවට ඔබට භාවිතා කළ හැකිය var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;.
Ege Özcan

1
@ EgeÖzcan එය එක්කෝ ඉහළට හෝ පහළට අයිතම දැමිය යුතුය, මෙන්න ක්‍රියාත්මක කිරීම මම pastebin.com/g4dt23jU
dzh

1
මෙය හොඳ විසඳුමක් නමුත් ඔබ සංඛ්‍යා සංසන්දනය කරන්නේ නම් එක් ගැටළුවක් ඇත. පරීක්ෂා කිරීමට පෙර කරුණාකර මෙය එක් කරන්න:if( !isNaN(a[property]) ) a[property] = Number(a[property]); if( !isNaN(b[property]) ) b[property] = Number(b[property]);
අයිවිජන් ස්ටෙෆාන් ස්ටිපික්

421

ES6 / ES2015 හෝ ඊට පසු ඔබට මේ ආකාරයෙන් කළ හැකිය:

objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom));

ES6 / ES2015 ට පෙර

objs.sort(function(a, b) {
    return a.last_nom.localeCompare(b.last_nom)
});

30
මෙය JS 1.1 සිට ලබා ගත හැකිය, මේ සඳහා ඇති මේද ඊතලය ES6 / 2015 කෑල්ලයි. නමුත් තවමත් ඉතා ප්‍රයෝජනවත්, සහ මගේ මතය අනුව හොඳම පිළිතුර
ජෝන් හාඩිං

13
RatPratikKelwalkar: ඔබට ආපසු හැරවීමට අවශ්‍ය නම් එය a හා b සංසන්දනය කරන්න: objs.sort ((a, b) => b.last_nom.localeCompare (a.last_nom));
ව්ලැඩ් බෙස්ඩන්

වර්ග කිරීම සඳහා ක්ෂේත්‍රය ආමන්ත්‍රණය කිරීම සඳහා දර්ශකයක් භාවිතා කළ හැකිද last_nom: අරාවෙහි ඇති අංකය පමණක් භාවිතා කිරීම වෙනුවට : 1?
සහ-බ්‍රි

4
පිළිතුරට ස්තූතියි ව්ලැඩ්බෙස්ඩන්! මෙම විසඳුම ඉතා කුඩා ක්‍රමලේඛන ප්‍රයත්නයක් සහ නිවැරදි වර්ග කිරීමේ ප්‍රති results ල සහ නූල් පෙළක් වැනි පළමු වැන්නයි: ["Name1", "Name10", "Name2", "වෙනත් දෙයක්", "Name11"]. නිවැරදිව වැඩ කිරීමට මට වර්ග කිරීමක් ලැබුණාobjs.sort((a, b) => a.last_nom.localeCompare(b.last_nom, undefined, {numberic: true}));
නායක

1
අවරෝහණ සංඛ්‍යා සමඟ මෙය කිරීමට: .sort ((a, b) => b.numberProperty - a.numberProperty). නැගීම: .sort ((a, b) => a.numberProperty - b.numberProperty)
සෙබස්තියන් පැටන්

188

underscore.js

අවධාරනය කරන්න, එහි කුඩා හා නියමයි ...

sortBy_. (උදා. දිග) අනුව වර්ග කිරීම සඳහා දේපලෙහි නූල් නම ද අනුකාරකය විය හැකිය.

var objs = [ 
  { first_nom: 'Lazslo',last_nom: 'Jamf' },
  { first_nom: 'Pig', last_nom: 'Bodine'  },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

var sortedObjs = _.sortBy( objs, 'first_nom' );

18
ඩේවිඩ්, ඔබට කීමට පිළිතුර සංස්කරණය කළ හැකිද , var sortedObjs = _.sortBy( objs, 'first_nom' );. objsඇත නැත මේ නිසා ම යථාර්ථය තේරුම් ගත. ශ්‍රිතය වර්ග කළ අරාවක් නැවත ලබා දෙනු ඇත . එය වඩාත් පැහැදිලි වනු ඇත.
ජෙස්

10
ආපසු හැරවීම සඳහා:var reverseSortedObjs = _.sortBy( objs, 'first_nom' ).reverse();
අර්ඩාල් ජී.

2
ඔබට javascript libary "underscore" පූරණය කළ යුතුය:<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"> </script>
and-bri

5
ඊට Lodashකැමති අය සඳහා ද ලබා ගත හැකිය
WoJ

2
ලොඩාෂ් වලදී මෙය සමාන වේ: var sortedObjs = _.sortBy( objs, 'first_nom' );නැතහොත් ඔබට එය වෙනත් අනුපිළිවෙලකට අවශ්‍ය නම්:var sortedObjs = _.orderBy( objs, ['first_nom'],['dsc'] );
ට්‍රැවිස් හීටර්

187

මිනිසුන් එය එතරම් සංකීර්ණ කරන්නේ මන්දැයි වටහා නොගන්න:

objs.sort(function(a, b){
  return a.last_nom > b.last_nom;
});

දැඩි එන්ජින් සඳහා:

objs.sort(function(a, b){
  return a.last_nom == b.last_nom ? 0 : +(a.last_nom > b.last_nom) || -1;
});

ප්‍රතිලෝම අකාරාදී පිළිවෙලට වර්ග කිරීමට ක්‍රියාකරු මාරු කරන්න.


17
වර්ග කිරීම සඳහා භාවිතා කරන ශ්‍රිතය -1, 0, හෝ 1 නැවත ලබා දිය යුතු බැවින් මෙය ඇත්ත වශයෙන්ම නිවැරදි නොවේ, නමුත් ඉහත ශ්‍රිතය බූලියන් ලබා දෙයි. වර්ග කිරීම ක්‍රෝම් වල හොඳින් ක්‍රියාත්මක වන නමුත් උදාහරණයක් ලෙස ෆැන්ටම් ජේඑස් හි අසමත් වේ. Code.google.com/p/phantomjs/issues/detail?id=1090
schup

සමහර එන්ජින් මෝඩකමට හේතු වේ, මේ ආකාරයෙන් එය සූරාකෑමකි. මම මගේ පිළිතුර නිසි අනුවාදයකින් යාවත්කාලීන කර ඇත.
p3lim

19
පළමු අනුවාදය පිටතට ගැනීම සඳහා සංස්කරණය කිරීමට මම යෝජනා කරමි. එහි වඩාත් සංක්ෂිප්ත බව නිසා වඩාත් ආකර්ෂණීය පෙනුමක් ඇත, නමුත් එය ක්‍රියා නොකරයි, අවම වශයෙන් විශ්වසනීය නොවේ. යමෙකු එය එක් බ්‍රව්සරයකින් උත්සාහ කර එය ක්‍රියාත්මක වන්නේ නම්, ඔවුන්ට ගැටලුවක් ඇති බව ඔවුන් නොදැන සිටිය හැකිය (විශේෂයෙන් ඔවුන් අදහස් කියවා නොමැතිනම්). දෙවන අනුවාදය නිසියාකාරව ක්‍රියාත්මක වන බැවින් පළමු අවශ්‍යතාව සැබවින්ම අවශ්‍ය නොවේ.
කේට්

2
Im සිමොන් පළමුව “තරමක් වැරදි” අනුවාදයක් තිබීම ඇත්තෙන්ම අගය කළෙමි, මන්ද දැඩි ලෙස ක්‍රියාත්මක කිරීම විග්‍රහ කිරීමට හා තේරුම් ගැනීමට තත්පර කිහිපයක් ගත වන අතර එය නොමැතිව එය වඩාත් අපහසු වනු ඇත.
ආරොන් ෂර්මන්

1
@ Lion789 මෙය කරන්න:if(a.count == b.count) return a.name > b.name; else return a.count > b.count;
p3lim

62

ඔබට අන්තිම නම් අනුපිටපත් තිබේ නම්, ඔබට ඒවා මුල් නම අනුව වර්ග කළ හැකිය-

obj.sort(function(a,b){
  if(a.last_nom< b.last_nom) return -1;
  if(a.last_nom >b.last_nom) return 1;
  if(a.first_nom< b.first_nom) return -1;
  if(a.first_nom >b.first_nom) return 1;
  return 0;
});

AdBadFeelingAbout මෙයින් නැවත පැමිණීම -1 හෝ 1 යන්නෙන් අදහස් කරන්නේ කුමක්ද? -1 වචනාර්ථයෙන් අදහස් කරන්නේ වාක්‍ය ඛණ්ඩයෙන් A ට වඩා අඩු බව මට වැටහී ඇති නමුත් 1 හෝ -1 භාවිතා කරන්නේ ඇයි? සෑම දෙනාම එම සංඛ්‍යා ප්‍රතිලාභ අගයන් ලෙස භාවිතා කරන බව මට පෙනේ, නමුත් ඇයි? ස්තූතියි.
ක්‍රිස්

1
22 ක්‍රිස් 22 a ණ සංඛ්‍යාවක් ආපසු ලබා දීම යන්නෙන් අදහස් වන්නේ අරාව තුළට bපැමිණිය යුතු බවයි a. ධනාත්මක සංඛ්‍යාවක් ආපසු ලබා දෙන්නේ නම්, එයින් අදහස් වන්නේ aපසුව පැමිණිය යුතු බවයි b. 0ආපසු ලබා දෙන්නේ නම් , එයින් අදහස් වන්නේ ඔවුන් සමාන යැයි සලකන බවයි. : සෑම විටම ඔබට ලේඛගතකිරීම කියවන්න පුළුවන් developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
BadFeelingAboutThis

AdBadFeelingAbout මෙම ස්තූතියි, පැහැදිලි කිරීම සහ සබැඳිය සඳහා. එය විශ්වාස කරන්න හෝ නොවන්න, මම 1, 0, -1මෙය මෙහි ඇසීමට පෙර විවිධ කේත ස්නිපෙට් භාවිතා කළෙමි. මට අවශ්‍ය තොරතුරු සොයා ගැනීමට මට නොහැකි විය.
ක්‍රිස්

48

මූලාකෘති උරුමය භාවිතා කරමින් මෙම ගැටලුවට සරල හා ඉක්මන් විසඳුමක්:

Array.prototype.sortBy = function(p) {
  return this.slice(0).sort(function(a,b) {
    return (a[p] > b[p]) ? 1 : (a[p] < b[p]) ? -1 : 0;
  });
}

උදාහරණ / භාවිතය

objs = [{age:44,name:'vinay'},{age:24,name:'deepak'},{age:74,name:'suresh'}];

objs.sortBy('age');
// Returns
// [{"age":24,"name":"deepak"},{"age":44,"name":"vinay"},{"age":74,"name":"suresh"}]

objs.sortBy('name');
// Returns
// [{"age":24,"name":"deepak"},{"age":74,"name":"suresh"},{"age":44,"name":"vinay"}]

යාවත්කාලීන කිරීම: තවදුරටත් මුල් අරාව වෙනස් නොකරයි.


5
එය වෙනත් අරාවක් ආපසු ලබා නොදේ. නමුත් ඇත්ත වශයෙන්ම මුල් එක වර්ග කරයි!
විනයා අගර්වාල්

ඔබ සංඛ්‍යා සහිත ස්වාභාවික වර්ගයක් භාවිතා කරන බවට සහතික කර ගැනීමට අවශ්‍ය නම් (එනම් 0,1,2,10,11 යනාදිය ...) රැඩික්ස් කට්ටලය සමඟ parseInt භාවිතා කරන්න. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... එසේ: ආපසු (parseInt (අ [පි], 10)> parseInt (ආ [පි], 10))? 1: (parseInt (a [p], 10) <parseInt (b [p], 10%)? -1: 0;
පෝල්

එය නිවැරදි කිරීම ගැන ස්තූතියි. නමුත් මම හිතන්නේ මෙම සංවේදීකරණය කිරීම සඳහා වර්ග කිරීම වෙනුවට, දත්ත වර්ග නිවැරදි කිරීම සඳහා අපි වෙනම කාර්යයක් කළහොත් වඩා හොඳය. වර්ග කිරීමේ ශ්‍රිතයට කුමන දේපලක කුමන ආකාරයේ දත්ත අඩංගු වේදැයි කිව නොහැකි බැවිනි. :)
විනයා අගර්වාල්

ඉතා කදිමයි. Asc / desc ආචරණය ලබා ගැනීම සඳහා ඊතල ආපසු හරවන්න.
අබ්දුල් සාදික් යාල්සින්

4
මූලික වස්තුවක මූලාකෘතිය වෙනස් කරන විසඳුමක් කිසි විටෙකත් යෝජනා
නොකරන්න

39

2018 වන විට වඩා කෙටි හා අලංකාර විසඳුමක් තිබේ. භාවිතා කරන්න. Array.prototype.sort () .

උදාහරණයක්:

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];

// sort by value
items.sort(function (a, b) {
  return a.value - b.value;
});

7
ප්රශ්නයේ දී සංඛ්යා හා සැසඳීම සඳහා නූල් භාවිතා කරන ලදී. ඔබේ පිළිතුර සංඛ්‍යා අනුව වර්ග කිරීම සඳහා විශිෂ්ට ලෙස ක්‍රියා කරයි, නමුත් නූල් අනුව සැසඳීම සඳහා එතරම් හොඳ නැත.
smcstewart

මෙම a.value - b.valueවස්තුව ගතිලක්ෂණ (සංසන්දනය සඳහා භාවිතා අංක මෙම නඩුවේ) දත්ත විවිධ අවස්ථාවන් සඳහා අනුගමනය කළ හැක. උදාහරණයක් ලෙස, අසල්වැසි නූල් යුගල සංසන්දනය කිරීමට රීජෙක්ස් භාවිතා කළ හැකිය .
0leg

1
Le 0leg මේ ආකාරයෙන් නූල් සංසන්දනය කිරීම සඳහා රීජෙක්ස් භාවිතා කිරීම පිළිබඳ උදාහරණයක් මෙහි දැකීමට මා කැමතිය.
බොබ් ස්ටයින්

ඔබට එය හැඳුනුම්පත අනුව වර්ග කිරීමට අවශ්‍ය නම් මෙම ක්‍රියාත්මක කිරීම තරමක් හොඳයි. ඔව්, ඔබ අසල්වැසි නූල් සංසන්දනය කිරීම සඳහා රීජෙක්ස් භාවිතා කිරීමට යෝජනා කර ඇති අතර එමඟින් විසඳුම වඩාත් සංකීර්ණ වන අතර ලබා දී ඇති විසඳුම සමඟ රීජෙක්ස් භාවිතා කරන්නේ නම් මෙම සරල කළ අනුවාදයේ අරමුණ වෙනත් ආකාරයකින් වනු ඇත. සරල බව හොඳම ය.
surendrapanday

33

නිවැරදි නොවන පැරණි පිළිතුර:

arr.sort((a, b) => a.name > b.name)

යාවත්කාලීන කරන්න

බීචම්ප්ගේ අදහස් දැක්වීමෙන්:

arr.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0))

වඩාත් කියවිය හැකි ආකෘතිය:

arr.sort((a, b) => {
  if (a.name < b.name) return -1
  return a.name > b.name ? 1 : 0
})

කැදැලි සහිත ත්‍රිකෝණ නොමැතිව:

arr.sort((a, b) => a.name < b.name ? - 1 : Number(a.name > b.name))

පැහැදිලි කිරීම මෙසේය: Number()හෙළයි trueකිරීමට 1හා falseකිරීමට 0.


එය ක්‍රියාත්මක වන නමුත් කිසියම් හේතුවක් නිසා
ප්‍රති result ලය

O AO17 නැත. ඔබට නූල් අඩු කළ නොහැක.
පැට්‍රික් රොබට්ස්

15
මෙය කළ යුත්තේ:arr.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0))
ජීන්-ප්‍රංශුවා බියුචම්ප්

3
@ ජීන්-ෆ්‍රැන්කොයිස්බියුචම්ප්, ඔබේ විසඳුම ඉතා හොඳින් හා වඩා හොඳින් ක්‍රියා කරයි.
අහ්සාන්

අංක සහිත 3 වන එක සරල හා ලස්සනයි!
කොජෝ

29

අභිරුචි සංසන්දනාත්මක ශ්‍රිතයක් භාවිතා කරනවා වෙනුවට, ඔබට අභිරුචි toString()ක්‍රමයක් සහිත වස්තු වර්ගයක් නිර්මාණය කළ හැකිය (පෙරනිමි සංසන්දනාත්මක ශ්‍රිතය මඟින් එය ආයාචනා කරනු ලැබේ):

function Person(firstName, lastName) {
    this.firtName = firstName;
    this.lastName = lastName;
}

Person.prototype.toString = function() {
    return this.lastName + ', ' + this.firstName;
}

var persons = [ new Person('Lazslo', 'Jamf'), ...]
persons.sort();

29

Lodash.js ( Underscore.js හි සුපර්සෙට් )

සෑම සරල තර්කනයකටම රාමුවක් එක් නොකිරීම හොඳය, නමුත් හොඳින් පරීක්ෂා කරන ලද උපයෝගිතා රාමු මත රඳා සිටීමෙන් සංවර්ධනය වේගවත් කළ හැකි අතර දෝෂ ප්‍රමාණය අඩු කළ හැකිය.

ලොඩාෂ් ඉතා පිරිසිදු කේතයක් නිපදවන අතර වඩාත් ක්‍රියාකාරී ක්‍රමලේඛ ශෛලිය ප්‍රවර්ධනය කරයි . එක් බැල්මකින් කේතයේ අභිප්‍රාය කුමක්ද යන්න පැහැදිලි වේ.

OP හි ගැටළුව සරලව විසඳිය හැක්කේ:

const sortedObjs = _.sortBy(objs, 'last_nom');

වැඩි විස්තර? උදා: අපට කැදැලි වස්තුවක් අනුගමනය කර ඇත:

const users = [
  { 'user': {'name':'fred', 'age': 48}},
  { 'user': {'name':'barney', 'age': 36 }},
  { 'user': {'name':'wilma'}},
  { 'user': {'name':'betty', 'age': 32}}
];

අපි දැන් භාවිතා කළ හැකිය _.property අයුරෙන් user.ageඅනිවාර්යයෙන් සමාන විය යුතු බව දේපල සඳහා වන මාර්ගය නියම කිරීමට. අපි පරිශීලක වස්තු කැදැලි වයස් දේපල අනුව වර්ග කරන්නෙමු. ඔව්, එය කැදැලි දේපල ගැලපීමට ඉඩ දෙයි!

const sortedObjs = _.sortBy(users, ['user.age']);

එය ආපසු හැරවීමට අවශ්‍යද? කිසිම ප්රශ්නයක් නැ. _.Reverse භාවිතා කරන්න .

const sortedObjs = _.reverse(_.sortBy(users, ['user.age']));

දාමය භාවිතයෙන් දෙකම ඒකාබද්ධ කිරීමට අවශ්‍යද ?

const { chain } = require('lodash');
const sortedObjs = chain(users).sortBy('user.age').reverse().value();

නැතහොත් ඔබ දම්වැල හරහා ගලා යාමට කැමති විට

const { flow, reverse, sortBy } = require('lodash/fp');
const sortedObjs = flow([sortBy('user.age'), reverse])(users); 

28

ඔයාට පාවිච්චි කරන්න පුළුවන්

පහසුම මාර්ගය: ලෝඩාෂ්

( https://lodash.com/docs/4.17.10#orderBy )

මෙම ක්‍රමය _.sortBy හා සමාන වන අතර එය අනුකාරකයන්ගේ වර්ග කිරීමේ නියෝග නියම කිරීමට ඉඩ දෙයි. ඇණවුම් නිශ්චිතව දක්වා නොමැති නම්, සියලු අගයන් ආරෝහණ අනුපිළිවෙලට වර්ග කර ඇත. එසේ නොමැති නම්, බැසයාම සඳහා “ඩෙස්ක්” අනුපිළිවෙලක් හෝ අනුරූප අගයන්හි අනුපිළිවෙල අනුපිළිවෙල සඳහා “ඇස්ක්” නියම කරන්න.

තර්ක

එකතුව (අරාව | වස්තුව): නැවත එකතු කිරීම සඳහා එකතුව. . [ඇණවුම්] (නූල් []): අනුකාරක වර්ග කිරීම.

ප්‍රතිලාභ

(අරාව): නව වර්ග කළ අරාව ලබා දෙයි.


var _ = require('lodash');
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":"6",
     "city":"Dallas",
     "state":"TX",
     "zip":"75000",
     "price":"556699"},
    {"h_id":"5",
     "city":"New York",
     "state":"NY",
     "zip":"00010",
     "price":"962500"}
    ];

_.orderBy(homes, ['city', 'state', 'zip'], ['asc', 'desc', 'asc']);

23

මෙහි හොඳ පිළිතුරු බොහොමයක් ඇත, නමුත් වඩාත් සංකීර්ණ වර්ග කිරීමක් ලබා ගැනීම සඳහා ඒවා ඉතා සරලව දීර් can කළ හැකි බව පෙන්වා දීමට කැමැත්තෙමි. ඔබ කළ යුතු එකම දෙය නම් මේ ආකාරයට සැසඳීමේ කාර්යයන් සඳහා OR ක්‍රියාකරු භාවිතා කිරීමයි:

objs.sort((a,b)=> fn1(a,b) || fn2(a,b) || fn3(a,b) )

කොහේද fn1, fn2... යනු නැවත වර්ග කරන ශ්‍රිත වේ [-1,0,1]. මෙහි ප්‍රති results ලය වනුයේ "fn1 අනුව වර්ග කිරීම", "fn2 අනුව වර්ග කිරීම", එය SQL හි ORDER BY ට සමාන වේ.

මෙම විසඳුම පදනම් වී ඇත්තේ සත්‍යය බවට පරිවර්තනය කළ හැකි පළමු ඇගයීමට ලක් කළ ප්‍රකාශනය|| ඇගයීමට ලක් කරන ක්‍රියාකරුගේ හැසිරීම මත ය .

සරලම පෝරමයට ඇත්තේ මෙවැනි එක් ආදාන ශ්‍රිතයක් පමණි:

// ORDER BY last_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) )

පියවර දෙකක් ඇති විට last_nom, first_nomපිළිවෙලට පිළිවෙලක් වනු ඇත:

// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) || 
                  a.first_nom.localeCompare(b.first_nom)  )

සාමාන්‍ය සංසන්දනාත්මක ශ්‍රිතයක් මේ වගේ දෙයක් විය හැකිය:

// ORDER BY <n>
let cmp = (a,b,n)=>a[n].localeCompare(b[n])

සංඛ්‍යාත්මක ක්ෂේත්‍ර, සිද්ධි සංවේදීතාව, අත්තනෝමතික දත්ත වර්ග ආදිය සඳහා මෙම ශ්‍රිතය පුළුල් කළ හැකිය.

වර්ග කිරීමේ ප්‍රමුඛතාවයෙන් ඔබට ඒවා දම්වැලෙන් භාවිතා කළ හැකිය:

// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> cmp(a,b, "last_nom") || cmp(a,b, "first_nom") )
// ORDER_BY last_nom, first_nom DESC
objs.sort((a,b)=> cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
// ORDER_BY last_nom DESC, first_nom DESC
objs.sort((a,b)=> -cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )

මෙහි ඇති කාරණය නම්, ක්‍රියාකාරී ප්‍රවේශයක් සහිත පිරිසිදු ජාවාස්ක්‍රිප්ට් බාහිර පුස්තකාල හෝ සංකීර්ණ කේත නොමැතිව ඔබට බොහෝ දුරක් යා හැකි බවයි. නූල් විග්‍රහ කිරීම සිදු නොකළ යුතු බැවින් එය ද ඉතා effective ලදායී වේ


23

උදාහරණ භාවිතය:

objs.sort(sortBy('last_nom'));

පිටපත:

/**
 * @description
 * Returns a function which will sort an
 * array of objects by the given key.
 *
 * @param  {String}  key
 * @param  {Boolean} reverse
 * @return {Function}
 */
const sortBy = (key, reverse) => {

  // Move smaller items towards the front
  // or back of the array depending on if
  // we want to sort the array in reverse
  // order or not.
  const moveSmaller = reverse ? 1 : -1;

  // Move larger items towards the front
  // or back of the array depending on if
  // we want to sort the array in reverse
  // order or not.
  const moveLarger = reverse ? -1 : 1;

  /**
   * @param  {*} a
   * @param  {*} b
   * @return {Number}
   */
  return (a, b) => {
    if (a[key] < b[key]) {
      return moveSmaller;
    }
    if (a[key] > b[key]) {
      return moveLarger;
    }
    return 0;
  };
};

මෙය බිඳ දැමීම ගැන ඔබට ස්තූතියි, 1, 0, -1වර්ග කිරීම සඳහා ඉලක්කම් භාවිතා කරන්නේ ඇයිද යන්න තේරුම් ගැනීමට මම උත්සාහ කරමි . ඉහත පැහැදිලි කිරීම සමඟ වුවද, එය ඉතා හොඳ පෙනුමක් - මම තවමත් එය තේරුම් ගෙන නැත. මම නිතරම සිතන්නේ -1අරාව දිග දේපල භාවිතා කරන විට, එනම්: arr.length = -1අයිතමය සොයාගත නොහැකි බවයි. මම බොහෝ විට මෙහි දේවල් මිශ්‍ර කර ඇත, නමුත් 1, 0, -1අනුපිළිවෙල තීරණය කිරීම සඳහා ඉලක්කම් භාවිතා කරන්නේ මන්දැයි තේරුම් ගැනීමට ඔබට උදව් කළ හැකිද? ස්තූතියි.
ක්‍රිස්

1
මෙය සම්පුර්ණයෙන්ම නිවැරදි නොවන නමුත් එය මේ ආකාරයට සිතීමට උපකාරී වේ: අරාව වෙත යොමු කරන ලද ශ්‍රිතය අරාවෙහි ඇති සෑම අයිතමයක් සඳහාම වරක් “a” ලෙස නම් කර ඇත. එක් එක් ශ්‍රිත ඇමතුමේ ප්‍රතිලාභ අගය වන්නේ "අ" අයිතමයේ දර්ශකය (වත්මන් ස්ථාන අංකය) ඊළඟ අයිතමය "ආ" හා සසඳන විට වෙනස් කළ යුතු ආකාරයයි. දර්ශකය අරාවෙහි අනුපිළිවෙල නියම කරයි (0, 1, 2 යනාදිය) එබැවින් "a" දර්ශකය 5 හි ඇති අතර ඔබ -1 ආපසු එන්නේ නම් 5 + -1 == 4 (එය ඉදිරියෙන් ඉදිරියට ගෙනයන්න) 5 + 0 == 5 (එය ඇති තැන තබා ගන්න) යනාදිය එය අවසන් වන තෙක් අසල්වැසියන් දෙදෙනෙකු සංසන්දනය කරමින් අරාව ගමන් කරයි.
ජේමි මේසන්

මෙය තවදුරටත් පැහැදිලි කිරීමට කාලය ගැනීම ගැන ඔබට ස්තූතියි. ඔබගේ පැහැදිලි කිරීම සහ භාවිතා කිරීමෙන් ඒ නිසා MDN Array.prototype.sort සාපේක්ෂව: මම ඔබට මම මේ ගැන හිතනවා දේ කියන්නම් aසහ bනම්, aවඩා වැඩි bවූ මිල දර්ශකය එක් කරන්න 1 aපිටුපස එය හා ස්ථානය bනම්, aකට වඩා අඩු b, සිට 1 අඩු aකර ඉදිරියෙන් තබන්න b. නම් aසහ bඑකම, 0 එකතු aසහ එය කොහෙද ඒක අත්හරින්න.
ක්‍රිස්

22

මම මෙතන භාවිතා කිරීම වැනි මිනිස්සු නෙවෙයි සාපේක්ෂව ක්රමය මම යන දෙකම සඳහා ක්රියා කරන, මෙය, මෙම විශේෂ ප්රවේශය යෝජනා දැකලා නැහැ stringහා number:

const objs = [ 
  { first_nom: 'Lazslo', last_nom: 'Jamf'     },
  { first_nom: 'Pig',    last_nom: 'Bodine'   },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

const sortBy = fn => (a, b) => {
  const fa = fn(a);
  const fb = fn(b);
  return -(fa < fb) || +(fa > fb);
};

const getLastName = o => o.last_nom;
const sortByLastName = sortBy(getLastName);

objs.sort(sortByLastName);
console.log(objs.map(getLastName));

මෙන්න මේ පිළිබඳ පැහැදිලි කිරීමක් sortBy():

sortBy()fnසංසන්දනයක් ලෙස භාවිතා කිරීමට වස්තුවකින් කුමන අගයක් තෝරා ගන්නේද යන්න පිළිගන්නා අතර එය සෘජුවම ලබා දිය හැකි ශ්‍රිතයක් නැවත ලබා දෙයි Array.prototype.sort(). මෙම උදාහරණයේ දී, අප භාවිතා කරන්නේ o.last_nomසැසඳීම් සඳහා වටිනාකම ලෙස, ඒ නිසා අපි වස්තූන් දෙකක් ලබා විට Array.prototype.sort()වැනි

{ first_nom: 'Lazslo', last_nom: 'Jamf' }

හා

{ first_nom: 'Pig', last_nom: 'Bodine' }

අපි පාවිච්චි කරන්නේ

(a, b) => {
  const fa = fn(a);
  const fb = fn(b);
  return -(fa < fb) || +(fa > fb);
};

ඒවා සංසන්දනය කිරීමට.

එය මතක තබා fn = o => o.last_nomගැනීමෙන්, අපට සංසන්දනාත්මක ශ්‍රිතය සමාන ලෙස පුළුල් කළ හැකිය

(a, b) => {
  const fa = a.last_nom;
  const fb = b.last_nom;
  return -(fa < fb) || +(fa > fb);
};

තාර්කික හෝ ||ක්‍රියාකරුට මෙහි ඉතා ප්‍රයෝජනවත් වන කෙටි පරිපථ ක්‍රියාකාරිත්වයක් ඇත. එය ක්‍රියා කරන ආකාරය නිසා, ඉහත ශ්‍රිතයේ ශරීරය අදහස් කරයි

if (fa < fb) return -1;
if (fa > fb) return 1;
return 0;

අමතර ප්‍රසාද දීමනාවක් ලෙස, ඊතල ශ්‍රිත නොමැතිව ECMAScript 5 හි සමාන වේ, එය අවාසනාවකට වඩා වාචික ය:

var objs = [ 
  { first_nom: 'Lazslo', last_nom: 'Jamf'     },
  { first_nom: 'Pig',    last_nom: 'Bodine'   },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

var sortBy = function (fn) {
  return function (a, b) {
    var fa = fn(a);
    var fb = fn(b);
    return -(fa < fb) || +(fa > fb);
  };
};

var getLastName = function (o) { return o.last_nom };
var sortByLastName = sortBy(getLastName);

objs.sort(sortByLastName);
console.log(objs.map(getLastName));


17

මෙම ප්‍රශ්නය ඉතා පැරණි බව මම දනිමි, නමුත් මගේ හා සමාන ක්‍රියාත්මක කිරීමක් මා දුටුවේ නැත.
මෙම අනුවාදය ෂ්වාට්සියානු පරිණාමන මෝඩකම මත පදනම් වේ .

function sortByAttribute(array, ...attrs) {
  // generate an array of predicate-objects contains
  // property getter, and descending indicator
  let predicates = attrs.map(pred => {
    let descending = pred.charAt(0) === '-' ? -1 : 1;
    pred = pred.replace(/^-/, '');
    return {
      getter: o => o[pred],
      descend: descending
    };
  });
  // schwartzian transform idiom implementation. aka: "decorate-sort-undecorate"
  return array.map(item => {
    return {
      src: item,
      compareValues: predicates.map(predicate => predicate.getter(item))
    };
  })
  .sort((o1, o2) => {
    let i = -1, result = 0;
    while (++i < predicates.length) {
      if (o1.compareValues[i] < o2.compareValues[i]) result = -1;
      if (o1.compareValues[i] > o2.compareValues[i]) result = 1;
      if (result *= predicates[i].descend) break;
    }
    return result;
  })
  .map(item => item.src);
}

මෙන්න එය භාවිතා කරන ආකාරය පිළිබඳ උදාහරණයක්:

let games = [
  { name: 'Mashraki',          rating: 4.21 },
  { name: 'Hill Climb Racing', rating: 3.88 },
  { name: 'Angry Birds Space', rating: 3.88 },
  { name: 'Badland',           rating: 4.33 }
];

// sort by one attribute
console.log(sortByAttribute(games, 'name'));
// sort by mupltiple attributes
console.log(sortByAttribute(games, '-rating', 'name'));

14

වර්ග කිරීම (වැඩි) වස්තූන්ගේ සංකීර්ණ අරා

මෙම අරාව වැනි වඩාත් සංකීර්ණ දත්ත ව්‍යුහයන් ඔබට හමු විය හැකි බැවින්, මම විසඳුම පුළුල් කරමි.

ටීඑල්; ඩී.ආර්

@ Ege-Özcan ගේ ඉතා සුන්දර පිළිතුර මත පදනම්ව වඩාත් ප්ලග් කළ හැකි අනුවාදයන් වේ.

ගැටලුව

මට පහත දැක්වෙන දේ හමු වූ අතර එය වෙනස් කළ නොහැක. වස්තුව තාවකාලිකව සමතලා කිරීමට ද මට අවශ්‍ය නොවීය. ප්‍රධාන වශයෙන් කාර්ය සාධන හේතූන් මත සහ එය මා විසින්ම ක්‍රියාත්මක කිරීමට ඇති විනෝදය සඳහා අවධාරනය / ලොඩාෂ් භාවිතා කිරීමට මට අවශ්‍ය නොවීය.

var People = [
   {Name: {name: "Name", surname: "Surname"}, Middlename: "JJ"},
   {Name: {name: "AAA", surname: "ZZZ"}, Middlename:"Abrams"},
   {Name: {name: "Name", surname: "AAA"}, Middlename: "Wars"}
];

ඉලක්කය

ඉලක්කය වන්නේ එය මූලික වශයෙන් People.Name.nameහා දෙවනුව අනුව වර්ග කිරීමයිPeople.Name.surname

බාධක

දැන්, මූලික විසඳුම තුළ ගතිකව වර්ග කිරීම සඳහා ගුණාංග ගණනය කිරීම සඳහා වරහන් අංකනය භාවිතා කරයි. මෙන්න, නමුත් අපට වරහන් අංකනය ගතිකව ගොඩනගා ගැනීමට සිදුවනු ඇත, මන්ද ඔබ බලාපොරොත්තු වන පරිදි යම් People['Name.name']වැඩක් සිදුවනු ඇතැයි ඔබ අපේක්ෂා කරනු ඇත - එය එසේ නොවේ.

සරලව කිරීම People['Name']['name'], අනෙක් අතට, ස්ථිතික වන අතර ඔබට n -th මට්ටමට යාමට පමණක් ඉඩ සලසයි .

විසඳුමක්

මෙහි ඇති ප්‍රධාන එකතු කිරීම වනුයේ වස්තු ගසෙන් බැස අවසාන පත්‍රයේ වටිනාකම තීරණය කිරීමයි, ඔබ සඳහන් කළ යුතු අතර ඕනෑම අතරමැදි පත්‍රයක්.

var People = [
   {Name: {name: "Name", surname: "Surname"}, Middlename: "JJ"},
   {Name: {name: "AAA", surname: "ZZZ"}, Middlename:"Abrams"},
   {Name: {name: "Name", surname: "AAA"}, Middlename: "Wars"}
];

People.sort(dynamicMultiSort(['Name','name'], ['Name', '-surname']));
// Results in...
// [ { Name: { name: 'AAA', surname: 'ZZZ' }, Middlename: 'Abrams' },
//   { Name: { name: 'Name', surname: 'Surname' }, Middlename: 'JJ' },
//   { Name: { name: 'Name', surname: 'AAA' }, Middlename: 'Wars' } ]

// same logic as above, but strong deviation for dynamic properties 
function dynamicSort(properties) {
  var sortOrder = 1;
  // determine sort order by checking sign of last element of array
  if(properties[properties.length - 1][0] === "-") {
    sortOrder = -1;
    // Chop off sign
    properties[properties.length - 1] = properties[properties.length - 1].substr(1);
  }
  return function (a,b) {
    propertyOfA = recurseObjProp(a, properties)
    propertyOfB = recurseObjProp(b, properties)
    var result = (propertyOfA < propertyOfB) ? -1 : (propertyOfA > propertyOfB) ? 1 : 0;
    return result * sortOrder;
  };
}

/**
 * Takes an object and recurses down the tree to a target leaf and returns it value
 * @param  {Object} root - Object to be traversed.
 * @param  {Array} leafs - Array of downwards traversal. To access the value: {parent:{ child: 'value'}} -> ['parent','child']
 * @param  {Number} index - Must not be set, since it is implicit.
 * @return {String|Number}       The property, which is to be compared by sort.
 */
function recurseObjProp(root, leafs, index) {
  index ? index : index = 0
  var upper = root
  // walk down one level
  lower = upper[leafs[index]]
  // Check if last leaf has been hit by having gone one step too far.
  // If so, return result from last step.
  if (!lower) {
    return upper
  }
  // Else: recurse!
  index++
  // HINT: Bug was here, for not explicitly returning function
  // https://stackoverflow.com/a/17528613/3580261
  return recurseObjProp(lower, leafs, index)
}

/**
 * Multi-sort your array by a set of properties
 * @param {...Array} Arrays to access values in the form of: {parent:{ child: 'value'}} -> ['parent','child']
 * @return {Number} Number - number for sort algorithm
 */
function dynamicMultiSort() {
  var args = Array.prototype.slice.call(arguments); // slight deviation to base

  return function (a, b) {
    var i = 0, result = 0, numberOfProperties = args.length;
    // REVIEW: slightly verbose; maybe no way around because of `.sort`-'s nature
    // Consider: `.forEach()`
    while(result === 0 && i < numberOfProperties) {
      result = dynamicSort(args[i])(a, b);
      i++;
    }
    return result;
  }
}

උදාහරණයක්

JSBin හි වැඩ කරන උදාහරණය


2
මන්ද? මෙය මුල් ප්‍රශ්නයට පිළිතුර නොවන අතර "ඉලක්කය" හුදෙක් People.sort ((a, b) => {ආපසු a.Name.name.localeCompare (b.Name.name) සමඟ විසඳා ගත හැකිය || a.Name. .surname.localeCompare (b.Name.surname)})
ටෙරෝ ටොලොනන්

12

තවත් එක් විකල්පයක්:

var someArray = [...];

function generateSortFn(prop, reverse) {
    return function (a, b) {
        if (a[prop] < b[prop]) return reverse ? 1 : -1;
        if (a[prop] > b[prop]) return reverse ? -1 : 1;
        return 0;
    };
}

someArray.sort(generateSortFn('name', true));

පෙරනිමියෙන් නැගීම.


1
අවශ්ය නම් ක්ෂේත්ර කිහිපයක් විසින් වර්ගීකරණයේ තරමක් වෙනස් අනුවාදය මෙහි වේ: stackoverflow.com/questions/6913512/...
Ravshan Samandarov

එය ඊළඟ එක විය හැකි බව පෙනේ: අපනයන ශ්‍රිතය ජනනය කිරීම SortFn (මුක්කු: නූල්, ප්‍රතිලෝම: බූලියන් = අසත්‍යය): (... args: any) => අංකය {ආපසු (a, b) => {ආපසු [මුක්කු ] <b [මුක්කු]? ආපසු හැරවීම? 1: -1: අ [මුක්කු]> ආ [මුක්කු]? ආපසු හැරවීම? -1: 1: 0; }; }
ඩෙන් කර්නි

කෙටිම කේතයට වඩා කියවිය හැකි කේතයකට මම කැමැත්තෙමි.
රව්ෂාන් සමන්දරොව්

එකඟ විය, නමුත් සමහර අවස්ථාවලදී මට උපයෝගිතා කාර්යයන් බැලීමට අවශ්‍යතාවයක් නොමැත.
ඩෙන් කර්නි

11

දේපලකින් වස්තු සමූහයක් වර්ග කරන සරල ශ්‍රිතයකි

function sortArray(array, property, direction) {
    direction = direction || 1;
    array.sort(function compare(a, b) {
        let comparison = 0;
        if (a[property] > b[property]) {
            comparison = 1 * direction;
        } else if (a[property] < b[property]) {
            comparison = -1 * direction;
        }
        return comparison;
    });
    return array; // Chainable
}

භාවිතය:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

sortArray(objs, "last_nom"); // Asc
sortArray(objs, "last_nom", -1); // Desc

ද්වි-දිශානුගත කිරීම සඳහා මෙම විසඳුම මට හොඳින් ක්‍රියාත්මක විය. ස්තූතියි ඔබට
මංජුව්‍රෙඩි

10

සරල ක්‍රමයක්:

objs.sort(function(a,b) {
  return b.last_nom.toLowerCase() < a.last_nom.toLowerCase();
});

'.toLowerCase()'නූල් සංසන්දනය කිරීමේදී වැරදි වළක්වා ගැනීමට එය අවශ්‍ය බව බලන්න .


4
කේතය තව ටිකක් අලංකාර කිරීමට ඔබට ඊතල ශ්‍රිත භාවිතා කළ හැකිය :objs.sort( (a,b) => b.last_nom.toLowerCase() < a.last_nom.toLowerCase() );
සර්ටේජ්

මෙය පැහැදිලි ලෙස එකම හේතුවක් නිසා වැරදි මෙතන .
පැට්‍රික් රොබට්ස්

2
ඊතල කාර්යයන් ES5- සුදුසු නොවේ. එන්ජින් ටොන් තවමත් ES5 ට සීමා කර ඇත. මගේ නඩුවේදී, මම ඊඑස් 5 එන්ජිමක සිටින බැවින් (මගේ සමාගම විසින් බල කරන ලද) ඉහත පිළිතුර සැලකිය යුතු ලෙස වඩා හොඳ බව මට
පෙනේ

9

Ege Özcan කේතය සඳහා අතිරේක ඩෙස්ක් පරාමිති

function dynamicSort(property, desc) {
    if (desc) {
        return function (a, b) {
            return (a[property] > b[property]) ? -1 : (a[property] < b[property]) ? 1 : 0;
        }   
    }
    return function (a, b) {
        return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
    }
}

9

විනේගේ අදහස සමඟ ඊජ්ගේ ගතික විසඳුම ඒකාබද්ධ කිරීමෙන් ඔබට හොඳ ශක්තිමත් විසඳුමක් ලැබේ:

Array.prototype.sortBy = function() {
    function _sortByAttr(attr) {
        var sortOrder = 1;
        if (attr[0] == "-") {
            sortOrder = -1;
            attr = attr.substr(1);
        }
        return function(a, b) {
            var result = (a[attr] < b[attr]) ? -1 : (a[attr] > b[attr]) ? 1 : 0;
            return result * sortOrder;
        }
    }
    function _getSortFunc() {
        if (arguments.length == 0) {
            throw "Zero length arguments not allowed for Array.sortBy()";
        }
        var args = arguments;
        return function(a, b) {
            for (var result = 0, i = 0; result == 0 && i < args.length; i++) {
                result = _sortByAttr(args[i])(a, b);
            }
            return result;
        }
    }
    return this.sort(_getSortFunc.apply(null, arguments));
}

භාවිතය:

// Utility for printing objects
Array.prototype.print = function(title) {
    console.log("************************************************************************");
    console.log("**** "+title);
    console.log("************************************************************************");
    for (var i = 0; i < this.length; i++) {
        console.log("Name: "+this[i].FirstName, this[i].LastName, "Age: "+this[i].Age);
    }
}

// Setup sample data
var arrObj = [
    {FirstName: "Zach", LastName: "Emergency", Age: 35},
    {FirstName: "Nancy", LastName: "Nurse", Age: 27},
    {FirstName: "Ethel", LastName: "Emergency", Age: 42},
    {FirstName: "Nina", LastName: "Nurse", Age: 48},
    {FirstName: "Anthony", LastName: "Emergency", Age: 44},
    {FirstName: "Nina", LastName: "Nurse", Age: 32},
    {FirstName: "Ed", LastName: "Emergency", Age: 28},
    {FirstName: "Peter", LastName: "Physician", Age: 58},
    {FirstName: "Al", LastName: "Emergency", Age: 51},
    {FirstName: "Ruth", LastName: "Registration", Age: 62},
    {FirstName: "Ed", LastName: "Emergency", Age: 38},
    {FirstName: "Tammy", LastName: "Triage", Age: 29},
    {FirstName: "Alan", LastName: "Emergency", Age: 60},
    {FirstName: "Nina", LastName: "Nurse", Age: 54}
];

//Unit Tests
arrObj.sortBy("LastName").print("LastName Ascending");
arrObj.sortBy("-LastName").print("LastName Descending");
arrObj.sortBy("LastName", "FirstName", "-Age").print("LastName Ascending, FirstName Ascending, Age Descending");
arrObj.sortBy("-FirstName", "Age").print("FirstName Descending, Age Ascending");
arrObj.sortBy("-Age").print("Age Descending");

1
අදහසට ස්තූතියි! මාර්ගය වන විට, කරුණාකර අරා මූලාකෘතිය වෙනස් කිරීමට මිනිසුන් උනන්දු නොකරන්න (මගේ උදාහරණය අවසානයේ අනතුරු ඇඟවීම බලන්න).
Ege Özcan

9

මේක උත්සාහ කරන්න,

UPTO ES5

//Ascending Sort
items.sort(function (a, b) {
   return a.value - b.value;
});


//Descending Sort
items.sort(function (a, b) {
   return b.value - a.value;
});


IN ES6 & above:

// Ascending sort
items.sort((a, b) => a.value - b.value);

// Descending Sort
 items.sort((a, b) => b.value - a.value);

1
හොඳම සහ පහසු විසඳුම
ඕමාර් හසන්

8

ඔබේ උදාහරණය අනුව, ඔබට ක්ෂේත්‍ර දෙකකින් (අවසාන නම, මුල් නම) වර්ග කළ යුතුය, ඒ වෙනුවට එකක්. එක් පේළියකින් මෙය වර්ග කිරීම සඳහා ඔබට ඇලස්කල් පුස්තකාලය භාවිතා කළ හැකිය :

var res = alasql('SELECT * FROM ? ORDER BY last_nom, first_nom',[objs]);

JsFiddle හි මෙම උදාහරණය උත්සාහ කරන්න .


8
objs.sort(function(a,b){return b.last_nom>a.last_nom})

1
ඇත්ත වශයෙන්ම එය ක්‍රියාත්මක වන බවක් නොපෙනුණි, පිළිගත් පිළිතුර භාවිතා කිරීමට සිදුවිය. එය නිවැරදිව වර්ග කිරීම නොවේ.
පිස්සු

8

මුල් උදාහරණය අනුව:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

බහු ක්ෂේත්‍ර අනුව වර්ග කරන්න:

objs.sort(function(left, right) {
    var last_nom_order = left.last_nom.localeCompare(right.last_nom);
    var first_nom_order = left.first_nom.localeCompare(right.first_nom);
    return last_nom_order || first_nom_order;
});

සටහන්

  • a.localeCompare(b)ඇත විශ්වීය සහාය සහ ප්රතිලාභ -1,0,1 නම් a<b, a==b, a>bපිළිවෙළින්.
  • ||අන්තිම පේළියට last_nomවඩා ප්‍රමුඛතාවය දෙයි first_nom.
  • අඩු කිරීම සංඛ්යා ක්ෂේත්ර මත ක්රියා කරයි: var age_order = left.age - right.age;
  • ආපසු හැරවීමේ අනුපිළිවෙල, return -last_nom_order || -first_nom_order || -age_order;

7

ව්යාකූලත්වයෙන් වලක්වා ගැනීම සඳහා ඔබට ඒවා කුඩා අකුරට පරිවර්තනය කිරීමට අවශ්ය විය හැකිය.

objs.sort(function (a,b) {

var nameA=a.last_nom.toLowerCase(), nameB=b.last_nom.toLowerCase()

if (nameA < nameB)
  return -1;
if (nameA > nameB)
  return 1;
return 0;  //no sorting

})

7
function compare(propName) {
    return function(a,b) {
        if (a[propName] < b[propName])
            return -1;
        if (a[propName] > b[propName])
            return 1;
        return 0;
    };
}

objs.sort(compare("last_nom"));

1
ඔබගේ කේතය කරන්නේ කුමක්ද සහ එය ගැටළුව විසඳන්නේ ඇයිද යන්න පිළිබඳ වැඩි විස්තරයක් එක් කිරීමට කරුණාකර ඔබගේ ලිපිය සංස්කරණය කිරීම සලකා බලන්න. බොහෝ විට කේත අඩංගු පිළිතුරක් (එය ක්‍රියාත්මක වුවද) සාමාන්‍යයෙන් OP හට ඔවුන්ගේ ගැටලුව තේරුම් ගැනීමට උදව් නොකරයි.
ඩ්‍රෙන්මි

7

රාම්ඩා භාවිතා කරමින්,

npm රාම්ඩා ස්ථාපනය කරන්න

import R from 'ramda'
var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];
var ascendingSortedObjs = R.sortBy(R.prop('last_nom'), objs)
var descendingSortedObjs = R.reverse(ascendingSortedObjs)

6

මෙය සරල ගැටළුවක්, මිනිසුන්ට මෙතරම් සංකීර්ණ විසඳුමක් ඇත්තේ මන්දැයි නොදනී.
සරල වර්ග කිරීමේ ශ්‍රිතයක් ( ඉක්මන් වර්ග කිරීමේ ඇල්ගොරිතම මත පදනම්ව ):

function sortObjectsArray(objectsArray, sortKey)
        {
            // Quick Sort:
            var retVal;

            if (1 < objectsArray.length)
            {
                var pivotIndex = Math.floor((objectsArray.length - 1) / 2);  // middle index
                var pivotItem = objectsArray[pivotIndex];                    // value in the middle index
                var less = [], more = [];

                objectsArray.splice(pivotIndex, 1);                          // remove the item in the pivot position
                objectsArray.forEach(function(value, index, array)
                {
                    value[sortKey] <= pivotItem[sortKey] ?                   // compare the 'sortKey' proiperty
                        less.push(value) :
                        more.push(value) ;
                });

                retVal = sortObjectsArray(less, sortKey).concat([pivotItem], sortObjectsArray(more, sortKey));
            }
            else
            {
                retVal = objectsArray;
            }

            return retVal;
        }

උදාහරණය භාවිතා කරන්න:

var myArr = 
        [
            { val: 'x', idx: 3 },
            { val: 'y', idx: 2 },
            { val: 'z', idx: 5 },
        ];
myArr = sortObjectsArray(myArr, 'idx');

5
Js හි ඉක්මන් වර්ග කිරීම ක්‍රියාත්මක කිරීම සරල විසඳුමක් වන්නේ කෙසේද? සරල ඇල්ගොරිතම නමුත් සරල විසඳුමක් නොවේ.
ඇන්ඩෲ

එය බාහිර පුස්තකාල භාවිතා නොකරන බැවින් එය සරල වන අතර එය වස්තුවේ මූලාකෘතිය වෙනස් නොකරයි. මගේ මතය අනුව, කේතයේ දිග කේතයේ සංකීර්ණතාවයට
impact ජුව බලපාන්නේ නැත

2
හොඳයි, මට විවිධ වචන වලින් උත්සාහ කිරීමට ඉඩ දෙන්න: රෝදය ප්‍රතිනිර්මාණය කිරීම සරල විසඳුමක් වන්නේ කෙසේද?
රොබර්ටෝ 14
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.