Nesnelerin dizesini string ├Âzellik de─čerine g├Âre s─▒ralama


Al─▒nan cevaba git


Bir dizi JavaScript nesnem var:

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

Onlar─▒ last_nom JavaScript'teki de─čerine g├Âre nas─▒l s─▒ralayabilirim ?

Biliyorum sort(a,b) ama bu sadece sicimler ve rakamlar ├╝zerinde ├žal─▒┼č─▒yor gibi g├Âr├╝n├╝yor. toString() Nesnelerime bir y├Ântem eklemem gerekir mi?


2484









Cevap say─▒s─▒n─▒ say: 30






Kendi kar┼č─▒la┼čt─▒rma fonksiyonunuzu yazmak yeterince kolayd─▒r:

 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 );
 

Veya sat─▒r i├ži (Marco Demaio / c):

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

3579







Ayr─▒ca, nesneleri iletti─činiz de─čerine g├Âre s─▒ralayan dinamik bir s─▒ralama i┼člevi de olu┼čturabilirsiniz:

 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;
    }
}
 

B├Âylece ┼č├Âyle bir nesne dizisine sahip olabilirsiniz:

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

... ve yapt─▒─č─▒n─▒zda i┼če yarayacak:

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

Asl─▒nda bu zaten soruyu cevapl─▒yor. A┼ča─č─▒daki b├Âl├╝m yaz─▒lm─▒┼čt─▒r, ├ž├╝nk├╝ bir├žok ki┼či benimle temasa ge├žti, birden fazla parametre ile ├žal─▒┼čmad─▒─č─▒ndan ┼čikayet etti .

Birden ├žok parametre

Birden ├žok s─▒ralama parametresi i├žeren s─▒ralama i┼člevleri olu┼čturmak i├žin a┼ča─č─▒daki i┼člevi kullanabilirsiniz.

 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;
    }
}
 

Hangi b├Âyle bir ┼čey yapman─▒za olanak sa─člar:

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

Alt S─▒n─▒flama Dizisi

Aram─▒zdaki yerli nesnelerin geni┼čletilmesine izin veren ES6'y─▒ kullanabilen ┼čansl─▒lar i├žin:

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

Bu, bunu m├╝mk├╝n k─▒lar:

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

795







ES6 / ES2015 veya sonraki s├╝r├╝mlerinde ┼ču ┼čekilde yapabilirsiniz:

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

318







underscore.js

alt ├žizgi kullan─▒n, k├╝├ž├╝k ve harika ...

sortBy_.sortBy (list, iterator, [ba─člam]) Her bir de─čeri yineleyici ├╝zerinden ├žal─▒┼čt─▒rman─▒n sonu├žlar─▒na g├Âre artan s─▒rada s─▒ralanm─▒┼č listenin s─▒ral─▒ bir kopyas─▒n─▒ d├Ând├╝r├╝r. Yineleyici, s─▒ralanacak ├Âzelli─čin dize ad─▒ da olabilir (├Ârn. Uzunluk).

 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' );
 

182







─░nsanlar─▒n neden bu kadar karma┼č─▒k hale geldi─čini anlama.

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

Daha sert motorlar i├žin:

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

Operat├Âr├╝ ters alfabetik s─▒raya g├Âre s─▒ralamak i├žin de─či┼čtirin.


174







Soyad─▒n─▒z yinelenirse, bunlar─▒ ilk ada g├Âre s─▒ralayabilirsiniz.

 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;
});
 

61







Prototip devralma kullanarak bu soruna basit ve h─▒zl─▒ bir ├ž├Âz├╝m:

 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;
  });
}
 

├ľrnek / Kullan─▒m

 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"}]
 

G├╝ncelleme: Art─▒k orijinal diziyi de─či┼čtirmiyor.


44







2018'den itibaren ├žok daha k─▒sa ve zarif bir ├ž├Âz├╝m var. Sadece kullan. Dizi.prototype.sort () .

├ľrnek:

 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;
});
 

32


2018-06-04





├ľzel bir kar┼č─▒la┼čt─▒rma i┼člevi kullanmak yerine, ├Âzel toString() y├Ântemle (varsay─▒lan kar┼č─▒la┼čt─▒rma i┼člevi taraf─▒ndan ├ža─čr─▒lan) bir nesne t├╝r├╝ de olu┼čturabilirsiniz :

 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







Kullanabilirsiniz

En Kolay Yol: Lodash

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

Bu y├Ântem, yinelemelerin s─▒ralama d├╝zenlerini belirtmeye izin vermesi d─▒┼č─▒nda _.sortBy gibidir. Emir belirtilmemi┼čse, t├╝m de─čerler artan d├╝zende s─▒ralan─▒r. Aksi takdirde, azalan i├žin "azalan" s─▒ras─▒n─▒ veya kar┼č─▒l─▒k gelen de─čerlerin artan s─▒ralama s─▒ras─▒n─▒ "artan" s─▒ras─▒n─▒ belirleyin.

Arg├╝manlar

collection (Array | Object): Yinelenecek koleksiyon. [iteratees = [_. identity]] (Array [] | Function [] | Object [] | string []): S─▒ralanacak yinelemeler. [orders] (string []): Yinelemelerin s─▒ralama d├╝zeni.

─░ade

(Dizi): Yeni s─▒ralanan diziyi d├Ând├╝r├╝r.


 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']);
 

26







Lodash.js ( Underscore.js'in ├╝st├╝ )

Her basit mant─▒k par├žas─▒ i├žin bir ├žer├ževe eklememek iyidir, ancak iyi test edilmi┼č bir yard─▒mc─▒ program ├žer├ževesine g├╝venmek, geli┼čmeyi h─▒zland─▒rmak ve yaz─▒lan hatalar─▒ azaltmak utan├ž verici de─čildir.

Lodash ├žok temiz kod ├╝retir ve daha az hatayla sonu├žlanan daha i┼člevsel bir programlama stili sunar. Bir bak─▒┼čta, kodun ne oldu─ču belli oluyor.

OP'nin sorunu basit├že ┼č├Âyle ├ž├Âz├╝lebilir:

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

Daha fazla bilgi? ├ľrn: i├ž i├že ge├žmi┼č nesneyi takip ettik:

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

┼×imdi e┼čle┼čtirilmesi gereken ├Âzelli─čin yolunu belirtmek i├žin _.property k─▒sayolunu kullanabiliriz user.age . Kullan─▒c─▒ nesnelerini i├ž i├že ya┼č ├Âzelli─čine g├Âre s─▒ralayaca─č─▒z. Evet, yuvalanm─▒┼č ├Âzellik e┼čle┼čmesine izin verir!

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

Tersine ├ževrilsin mi? Sorun de─čil. _.Reverse kullan─▒n .

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

─░kisini de yerine Zincirleme kullanarak birle┼čtirmek ister misiniz ?

 const sortedObjs = _.chain(users).sortBy('user.age').reverse().value();
 

23







Burada ├žok g├╝zel cevaplar var, ancak ├žok daha karma┼č─▒k bir s─▒ralama elde etmek i├žin ├žok basit bir ┼čekilde geni┼čletilebileceklerini belirtmek isterim. Yapman─▒z gereken tek ┼čey, OR operat├Âr├╝n├╝ a┼ča─č─▒daki gibi kar┼č─▒la┼čt─▒rma fonksiyonlar─▒n─▒ zincirlemek i├žin kullanmakt─▒r:

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

Nerede fn1 ,, fn2 ... d├Ânen fonksiyonlar [-1,0,1]. Bu, "fn1 ile s─▒ralama", "fn2 ile s─▒ralama" ile sonu├žlan─▒r;

Bu ├ž├Âz├╝m, ger├žek haline d├Ân├╝┼čt├╝r├╝lebilen ilk de─čerlendirilen ifadeyi || de─čerlendiren i┼člecin davran─▒┼č─▒na dayanmaktad─▒r .https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators%23Logical_operators#Logical_operators

En basit form , bunun gibi sadece bir s─▒ral─▒ fonksiyona sahiptir:

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

─░ki a┼čamal─▒ olmakla last_nom , first_nom s─▒ralama d├╝zeni ┼č├Âyle g├Âr├╝n├╝r:

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

Genel bir kar┼č─▒la┼čt─▒rma i┼člevi a┼ča─č─▒daki gibi olabilir:

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

Bu fonksiyon, say─▒sal alanlar─▒, b├╝y├╝k k├╝├ž├╝k harf duyarl─▒l─▒─č─▒n─▒, arbiter veri tiplerini vb. Desteklemek i├žin geni┼čletilebilir.

Bunlar─▒ s─▒ralama ├Ânceli─čine g├Âre zincirleme ile kullanabilirler:

 // 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") )
 

Buradaki nokta, i┼člevsel yakla┼č─▒ma sahip saf JavaScript'in d─▒┼č k├╝t├╝phaneler veya karma┼č─▒k kodlar olmadan uzun bir yol alabilmesidir. Ayr─▒ca ├žok etkilidir, ├ž├╝nk├╝ herhangi bir string ayr─▒┼čt─▒rma yap─▒lmas─▒ gerekmez


22







├ľrnek Kullan─▒m:

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

Senaryo:

 /**
 * @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;
  };
};
 

20







Benim i├žin ├žal─▒┼čan bir kodum var:

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

G├ťNCELLEME: Her zaman ├žal─▒┼čm─▒yor, bu y├╝zden do─čru de─čil :(


18







Bu ├Âzel yakla┼č─▒m─▒ ├Ânerdi─čimde g├Ârmedim, bu y├╝zden i┼čte bu string ve her ikisinde de ├žal─▒┼čmay─▒ sevdi─čim k─▒sa bir kar┼č─▒la┼čt─▒rma y├Ântemi 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)) 

─░┼čte bir a├ž─▒klama sortBy() :

sortBy() kabul eden bir fn Nesneden hangi de─čeri se├žer kar┼č─▒la┼čt─▒rma ve d├Ân├╝┼č do─črudan ge├žirilebilir bir fonksiyonu olarak kullanmak i├žin bu Array.prototype.sort() . Bu ├Ârnekte, o.last_nom kar┼č─▒la┼čt─▒rma i├žin de─čer olarak kullan─▒yoruz , bu nedenle ne Array.prototype.sort() gibi iki nesne ald─▒─č─▒m─▒zda

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

ve

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

kullan─▒r─▒z

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

onlar─▒ kar┼č─▒la┼čt─▒rmak i├žin.

Bunu hat─▒rlayarak fn = o => o.last_nom , kar┼č─▒la┼čt─▒rma i┼člevini e┼čde─čerine geni┼čletebiliriz

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

Mant─▒ksal OR || operat├Âr├╝, burada ├žok kullan─▒┼čl─▒ olan k─▒sa devre yapan bir i┼člevselli─če sahiptir. Nas─▒l ├žal─▒┼čt─▒─č─▒ndan dolay─▒ yukar─▒daki i┼člevin g├Âvdesi

 if (fa < fb) return -1
return +(fa > fb)
 

Yani e─čer fa < fb biz d├Ânmek -1 aksi takdirde fa > fb o zaman d├Ânmek +1 fakat e─čer fa == fb , o zaman fa < fb ve fa > fb vard─▒r false d├Ând├╝r├╝r, b├Âylece +0 .

Ek bir bonus olarak, i┼čte ECMAScript 5ÔÇÖin ok i┼člevsiz e┼čde─čeri, bu da ne yaz─▒k ki daha ayr─▒nt─▒l─▒:

 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)) 


18







Bu sorunun ├žok eski oldu─čunu biliyorum, fakat benimkine benzer bir uygulama g├Ârmedim.
Bu s├╝r├╝m Schwartzian d├Ân├╝┼č├╝m deyimine dayanmaktad─▒r .

 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);
}
 

─░┼čte nas─▒l kullan─▒laca─č─▒na bir ├Ârnek:

 let games = [
  { name: 'Pako',              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'));
 

15


2016-11-06





S─▒ralama (daha fazla) Nesnelerin Karma┼č─▒k Dizileri

Muhtemelen bu dizi gibi daha karma┼č─▒k veri yap─▒lar─▒yla kar┼č─▒la┼čt─▒─č─▒n─▒z i├žin ├ž├Âz├╝m├╝ geni┼čletirim.

TL; DR

@ Ege-├ľzcan'─▒n ├žok g├╝zel cevab─▒n─▒ temel alan daha tak─▒labilir bir versiyon .

Sorun

A┼ča─č─▒dakine rastlad─▒m ve de─či┼čtiremedim. Ayr─▒ca nesneyi ge├žici olarak d├╝zle┼čtirmek istemedim. Ben de ├Âzellikle performans nedeniyle ve kendimi uygulama e─člencesi i├žin alt ├žizgi / lodash kullanmak istemedim.

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

Hedef

Ama├ž, ├Âncelikli olarak People.Name.name ve ikincil olarak s─▒ralama yapmakt─▒r. People.Name.surname

Engeller

┼×imdi, temel ├ž├Âz├╝mde, dinamik olarak s─▒ralamak i├žin ├Âzellikleri hesaplamak i├žin parantez g├Âsterimi kullan─▒r. Burada, parantez notasyonunu dinamik olarak da olu┼čturmak zorunda kalaca─č─▒z, ├ž├╝nk├╝ baz─▒lar─▒n─▒n People['Name.name'] i┼če yarayaca─č─▒n─▒ umuyorsunuz.

Basit├že yap─▒yor People['Name']['name'] , di─čer taraftan, statik ve yaln─▒zca inmek i├žin izin verir n -inci seviyesini.

├ç├Âz├╝m

Buradaki ana eklenti, nesne a─čac─▒ndan a┼ča─č─▒ya do─čru y├╝r├╝mek ve son yapra─č─▒n de─čerini, belirtmeniz gereken herhangi bir arac─▒ yapra─č─▒n de─čerini belirlemek olacakt─▒r.

 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;
  }
}
 

├ľrnek

JSBin'de ├žal─▒┼čma ├Ârne─čihttp://jsbin.com/lotifa/2/edit%3Fjs,console


14







Bir se├ženek daha:

 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));
 

varsay─▒lan olarak artan s─▒rada s─▒ralar.


11







Basit bir yol:

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

'.toLowerCase()' Dizeleri kar┼č─▒la┼čt─▒r─▒rken hatalar─▒ ├Ânlemek i├žin gerekli oldu─čuna bak─▒n .


10







Ege ├ľzcan kodu i├žin ek azalan params

 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







Ege'nin dinamik ├ž├Âz├╝m├╝n├╝ Vinay'in fikriyle birle┼čtirerek g├╝zel ve sa─člam bir ├ž├Âz├╝m elde edersiniz:

 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));
}
 

Kullan─▒m─▒:

 // 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");
 

9







Bir nesnenin dizisini bir ├Âzelli─če g├Âre s─▒ralayan basit bir i┼člev

 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
}
 

Kullan─▒m─▒:

 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
 

9







├ľrne─činize g├Âre, bir taneden ├žok iki alana (soyad─▒, ad─▒) s─▒ralaman─▒z gerekir. Alasql k├╝t├╝phanesini bu s─▒ralamay─▒ bir sat─▒rda yapmak i├žin kullanabilirsiniz :

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

Bu ├Ârne─či jsFiddle'da deneyin .


8







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

8







Kar─▒┼č─▒kl─▒─č─▒ ├Ânlemek i├žin bunlar─▒ k├╝├ž├╝k harfe d├Ân├╝┼čt├╝rmeniz gerekebilir.

 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"));
 

7







Orijinal ├Ârnek verildi─činde:

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

Birden ├žok alana g├Âre s─▒rala:

 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;
});
 

notlar

  • a.localeCompare(b) oldu─ču evrensel olarak desteklenen ve d├Âner -1,0,1 e─čer a<b , a==b , a>b s─▒ras─▒yla.
  • || son sat─▒rda last_nom ├Âncelik verir first_nom .
  • ├ç─▒karma say─▒sal alanlarda ├žal─▒┼č─▒r: var age_order = left.age - right.age;
  • Sipari┼či tersine ├ževirmek, return -last_nom_order || -first_nom_order || -age_order;

7







Bu basit bir sorundur, insanlar─▒n neden bu kadar karma┼č─▒k bir ├ž├Âz├╝me sahip olduklar─▒n─▒ bilmiyorum.
Basit bir s─▒ralama i┼člevi ( h─▒zl─▒ s─▒ralama algoritmas─▒na dayal─▒ ):

 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;
        }
 

├ľrnek kullan─▒n:

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

6







Ramda'y─▒ kullanmak,

npm ramda y├╝kleyin

 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







Ben sadece geli┼čmi┼č Ege ├ľzcan derin nesnelere i├žine dal─▒┼č i├žin '─▒n dinamik t├╝r. Data ┼č├Âyle g├Âz├╝k├╝yorsa:

 obj = [
    {
        a: { a: 1, b: 2, c: 3 },
        b: { a: 4, b: 5, c: 6 }
    },
    { 
        a: { a: 3, b: 2, c: 1 },
        b: { a: 6, b: 5, c: 4 }
}];
 

Bunu ├╝zerine s─▒ralamak istiyorsan─▒z ve aa ├Âzelli─či benim geli┼čtirme ├žok iyi olur d├╝┼č├╝n├╝yorum. Bunun gibi nesnelere yeni i┼člevler ekliyorum:

 Object.defineProperty(Object.prototype, 'deepVal', {
    enumerable: false,
    writable: true,
    value: function (propertyChain) {
        var levels = propertyChain.split('.');
        parent = this;
        for (var i = 0; i < levels.length; i++) {
            if (!parent[levels[i]])
                return undefined;
            parent = parent[levels[i]];
        }
        return parent;
    }
});
 

ve de─či┼čtirilen _dynamicSort '─▒n d├Ân├╝┼č fonksiyonu:

 return function (a,b) {
        var result = ((a.deepVal(property) > b.deepVal(property)) - (a.deepVal(property) < b.deepVal(property)));
        return result * sortOrder;
    }
 

Ve ┼čimdi aa'ya g├Âre ┼ču ┼čekilde s─▒ralayabilirsiniz :

 obj.sortBy('a.a');
 

─░├žinde Commplete'den senaryoyu bak─▒n JSFiddle


5



─░lgili yay─▒nlar


JavaScript nesnesini m├╝lk de─čerine g├Âre nesne dizisinden al─▒n [duplicate]

Nesnelerin dizisini nesne alanlar─▒na g├Âre s─▒ralama

Nesnelerin dizisini tarih de─čeri olan tek bir anahtara g├Âre s─▒ralay─▒n

Baz─▒ ├Âzelliklere g├Âre nesne listesi nas─▒l s─▒ralan─▒r

Swift: Nesnelerin dizisini alfabetik olarak s─▒rala

Nesneler dizisini birden ├žok alana g├Âre nas─▒l s─▒ralayabilirim?

Android-java- Nesnelerin listesini, nesnedeki belirli bir de─čere g├Âre s─▒ralama

Nesnelerin de─čerini filtreleme dizisini ├Âzellik de─čerine g├Âre raylar

Nesne dizisini de─čerine g├Âre s─▒ralamak i├žin Lodash kullan─▒n.

Bir boolean ├Âzelli─čine g├Âre Javascript s─▒ralama dizisi

Etiketle ilgili di─čer sorular [javascript]


Yorumlar JSON'da kullan─▒labilir mi?

Git: Sadece yerel ┼čubeleri nas─▒l listeleyebilirim?

Y├╝zen say─▒lar─▒, gereksiz onluk 0 olmadan Dize bi├žiminde g├╝zel bir bi├žimde bi├žimlendirme nas─▒l yap─▒l─▒r?

Serseri s─▒k─▒┼čm─▒┼č ba─člant─▒ zaman a┼č─▒m─▒ yeniden deneniyor

─░OS 9'da App Transport Security etkinken bir HTTP URL'sini nas─▒l y├╝klerim? [├žift]

Xcode 9'da iOS 11, Apple TV 4K, vb. ─░le kablosuz hata ay─▒klamay─▒ nas─▒l ger├žekle┼čtiriyorsunuz?

Daha iyi bir Windows Konsol Penceresi var m─▒? [kapal─▒]

JVM'nin uzaktan hata ay─▒klanmas─▒na izin vermek i├žin ayarlanan Java komut sat─▒r─▒ se├ženekleri nelerdir?

En kullan─▒┼čl─▒ Intellij IDEA klavye k─▒sayollar─▒ nelerdir? [kapal─▒]

Eclipse varsay─▒lan ├žal─▒┼čma alan─▒ nas─▒l de─či┼čtirilir?