Mengurutkan objek dalam array berdasarkan abjad pada satu properti array

201

Katakanlah Anda memiliki kelas JavaScript seperti ini

var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}

Katakanlah Anda kemudian membuat sejumlah instance dari kelas itu dan menyimpannya dalam sebuah array

var objArray = [];
objArray.push(DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));

Jadi saya sekarang akan memiliki array objek yang dibuat oleh DepartmentFactory. Bagaimana saya menggunakan array.sort()metode untuk mengurutkan array objek ini dengan DepartmentNameproperti masing-masing objek?

The array.sort()Metode bekerja dengan baik ketika menyortir array dari string

var myarray=["Bob", "Bully", "Amy"];
myarray.sort(); //Array now becomes ["Amy", "Bob", "Bully"]

Tetapi bagaimana cara membuatnya bekerja dengan daftar objek?

jdavis
sumber
Anda bisa melewatkan fungsi sortir sebagai argumen pertama ke .sort ().
Paul Tomblin
2
Karena Anda menggunakan DepartmentFactorysebagai konstruktor, buat objeknya menggunakan new DepartmentFactory, jika tidak array akan diisi dengan banyak undefinednilai.
Anurag

Jawaban:

342

Anda harus melakukan sesuatu seperti ini:

objArray.sort(function(a, b) {
    var textA = a.DepartmentName.toUpperCase();
    var textB = b.DepartmentName.toUpperCase();
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});

Catatan: mengubah kasing (ke atas atau bawah) memastikan jenis case tidak sensitif.

Omer Bokhari
sumber
3
Saya telah mencapai jawaban Anda 50 trilyun kali karena saya tidak pernah ingat bagaimana melakukan ini. FWIW, Linter saya selalu memberi tahu saya tentang "tanda kurung serampangan di sekitar ekspresi": return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;Tidak akan mengedit jawaban Anda, mengulurkan harapan saya setidaknya akan mengingat hal
pengintaian
Terima kasih untuk Omer ini
Ted Fitzpatrick
Menemukan masalah dengan kode ini. Gunakan kombinasi huruf kecil dan besar. ex. credit_card_no dan City. Kode memang mengurutkan daftar tetapi kata-kata yang dimulai dengan 'c' tidak dikelompokkan bersama.
Kedar
157

Untuk mendukung unicode:

objArray.sort(function(a, b) {
   return a.DepartmentName.localeCompare(b.DepartmentName);
});
ron tornambe
sumber
7
Untuk versi case-insensitive, gunakan yang berikut pada baris 2:return a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase());
Ben Barreth
3
pelajari sesuatu yang baru setiap hari - localeComparekeren dan memiliki semua dukungan browser untuk arg pertama. Tidak buruk!
obzenner
4
@ BenBarreth tidak ada alasan untuk mengurangi string. intinya localeCompareadalah melangsir pekerjaan mengelola logika semacam dan kebiasaan lokal ke sistem. Jika melakukan jenis huruf tidak sensitif adalah normal untuk lokal, seperti dalam bahasa Inggris, ini akan dilakukan untuk Anda: "Z" > 'a' // false "Z".localeCompare('a') // 1 Jika Anda ingin menyimpang dari default lokal, Anda dapat mengirim serta menimpa di localesdan optionsparameter: developer.mozilla. org / id-AS / docs / Web / JavaScript / Referensi / ...
Jon z
12
var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}

// use `new DepartmentFactory` as given below. `new` is imporatant

var objArray = [];
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));

function sortOn(property){
    return function(a, b){
        if(a[property] < b[property]){
            return -1;
        }else if(a[property] > b[property]){
            return 1;
        }else{
            return 0;   
        }
    }
}

//objArray.sort(sortOn("id")); // because `this.id = data.Id;`
objArray.sort(sortOn("name")); // because `this.name = data.DepartmentName;`
console.log(objArray);

demo: http://jsfiddle.net/diode/hdgeH/

Diode
sumber
9
// Sorts an array of objects "in place". (Meaning that the original array will be modified and nothing gets returned.)
function sortOn (arr, prop) {
    arr.sort (
        function (a, b) {
            if (a[prop] < b[prop]){
                return -1;
            } else if (a[prop] > b[prop]){
                return 1;
            } else {
                return 0;   
            }
        }
    );
}

//Usage example:

var cars = [
        {make:"AMC",        model:"Pacer",  year:1978},
        {make:"Koenigsegg", model:"CCGT",   year:2011},
        {make:"Pagani",     model:"Zonda",  year:2006},
        ];

// ------- make -------
sortOn(cars, "make");
console.log(cars);

/* OUTPUT:
AMC         : Pacer : 1978
Koenigsegg  : CCGT  : 2011
Pagani      : Zonda : 2006
*/



// ------- model -------
sortOn(cars, "model");
console.log(cars);

/* OUTPUT:
Koenigsegg  : CCGT  : 2011
AMC         : Pacer : 1978
Pagani      : Zonda : 2006
*/



// ------- year -------
sortOn(cars, "year");
console.log(cars);

/* OUTPUT:
AMC         : Pacer : 1978
Pagani      : Zonda : 2006
Koenigsegg  : CCGT  : 2011
*/
bob
sumber
5

DEMO

var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}

var objArray = [];
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));

console.log(objArray.sort(function(a, b) { return a.name > b.name}));
qwertymk
sumber
2
objArray.sort( (a, b) => a.id.localeCompare(b.id, 'en', {'sensitivity': 'base'}));

Ini mengurutkan mereka menurut abjad DAN tidak sensitif huruf. Ini juga sangat bersih dan mudah dibaca: D

Alissa
sumber
Jauh lebih elegan daripada solusi yang diterima!
Kano
Ini juga satu-satunya jawaban yang menyebutkan 'sensitivity': 'base', yang membuat perbedaan besar tergantung pada aplikasi Anda menurut MDN .
phantomraa
2
objArray.sort((a, b) => a.DepartmentName.localeCompare(b.DepartmentName))
Neil
sumber
1

lakukan seperti ini

objArrayy.sort(function(a, b){
 var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase()
 if (nameA < nameB) //sort string ascending
  return -1
 if (nameA > nameB)
  return 1
 return 0 //default return value (no sorting)
});
console.log(objArray)
Nickleefly
sumber
0

Berikut adalah fungsi sederhana yang dapat Anda gunakan untuk mengurutkan array objek melalui propertinya; tidak masalah jika properti adalah tipe string atau integer, itu akan berfungsi.

    var cars = [
        {make:"AMC",        model:"Pacer",  year:1978},
        {make:"Koenigsegg", model:"CCGT",   year:2011},
        {make:"Pagani",     model:"Zonda",  year:2006},
    ];

    function sortObjectsByProp(objectsArr, prop, ascending = true) {
        let objectsHaveProp = objectsArr.every(object => object.hasOwnProperty(prop));
        if(objectsHaveProp)    {
            let newObjectsArr = objectsArr.slice();
            newObjectsArr.sort((a, b) => {
                if(isNaN(Number(a[prop])))  {
                    let textA = a[prop].toUpperCase(),
                        textB = b[prop].toUpperCase();
                    if(ascending)   {
                        return textA < textB ? -1 : textA > textB ? 1 : 0;
                    } else {
                        return textB < textA ? -1 : textB > textA ? 1 : 0;
                    }
                } else {
                    return ascending ? a[prop] - b[prop] : b[prop] - a[prop];
                }
            });
            return newObjectsArr;
        }
        return objectsArr;
    }

    let sortedByMake = sortObjectsByProp(cars, "make"); // returns ascending order by its make;
    let sortedByYear = sortObjectsByProp(cars, "year", false); // returns descending order by its year,since we put false as a third argument;
    console.log(sortedByMake);
    console.log(sortedByYear);

Michael Norward
sumber
-1

Anda harus melewati fungsi yang menerima dua parameter, membandingkannya, dan mengembalikan angka, jadi anggap Anda ingin mengurutkannya berdasarkan ID yang akan Anda tulis ...

objArray.sort(function(a,b) {
    return a.id-b.id;
});
// objArray is now sorted by Id
zconnelly13
sumber
5
Dia bertanya tentang pengurutan berdasarkan DepartmentName, bukan Id.
Paul Tomblin
Saya mencoba ini dan ini tampaknya tidak berfungsi pada kolom string ... ini berfungsi pada kolom tanggal. Apa yang berhasil adalah solusi dari @ omer-bokhari
tsando
-2

Setelah mencoba sedikit tentang ini, dan mencoba membuat loop lebih sedikit mungkin, saya berakhir dengan solusi ini:

Demo di codepen

const items = [
      {
        name: 'One'
      },
      {
        name: 'Maria is here'
      },
      {
        name: 'Another'
      },
      {
        name: 'Z with a z'
      },
      {
        name: '1 number'
      },
      {
        name: 'Two not a number'
      },
      {
        name: 'Third'
      },
      {
        name: 'Giant'
      }
    ];

    const sorted = items.sort((a, b) => {
      return a[name] > b[name];
    });

    let sortedAlphabetically = {};

    for(var item in sorted) {
      const firstLetter = sorted[item].name[0];
      if(sortedAlphabetically[firstLetter]) {
        sortedAlphabetically[firstLetter].push(sorted[item]);
      } else {
        sortedAlphabetically[firstLetter] = [sorted[item]]; 
      }
    }

    console.log('sorted', sortedAlphabetically);
Alexandre Magno Teles Zimerer
sumber
-3

Jawaban sederhana:

objArray.sort(function(obj1, obj2) {
   return obj1.DepartmentName > obj2.DepartmentName;
});

Cara ES6:

objArray.sort((obj1, obj2) => {return obj1.DepartmentName > obj2.DepartmentName};

Jika Anda perlu membuatnya menjadi huruf kecil / besar dll, lakukan saja dan simpan yang menghasilkan variabel daripada membandingkan variabel itu. Contoh:

objArray.sort((obj1, obj2) => {
   var firstObj = obj1.toLowerCase();
   var secondObj = obj2.toLowerCase();
   return firstObj.DepartmentName > secondObj.DepartmentName;
});
Masha
sumber