Menyortir array objek berdasarkan nilai properti


1334

Saya punya objek berikut menggunakan AJAX dan menyimpannya dalam array:

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

Bagaimana cara membuat fungsi untuk mengurutkan objek berdasarkan priceproperti hanya dalam urutan naik atau turun menggunakan JavaScript?


cara tercepat adalah dengan menggunakan modul array- isomorfik yang bekerja secara native di kedua browser dan node, mendukung semua jenis input, bidang yang dikomputasi dan pesanan penyortiran khusus.
Lloyd

Jawaban:


1674

Urutkan rumah berdasarkan harga dengan urutan menaik:

homes.sort(function(a, b) {
    return parseFloat(a.price) - parseFloat(b.price);
});

Atau setelah versi ES6:

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

Beberapa dokumentasi dapat ditemukan di sini .


184
Anda dapat menggunakan string1.localeCompare(string2)untuk perbandingan string
bradvido

62
Perlu diingat bahwa localeCompare()case- sensitive . Jika Anda ingin peka huruf besar-kecil, Anda dapat menggunakannya (string1 > string2) - (string1 < string2). Nilai boolean dipaksa untuk integer 0 dan 1 untuk menghitung perbedaannya.
Don Kirkby

2
Terima kasih atas pembaruannya, @Pointy, saya tidak ingat mengalami masalah ini, tapi mungkin perilakunya telah berubah dalam beberapa tahun terakhir. Apapun, localeCompare()dokumentasi menunjukkan bahwa Anda dapat secara eksplisit menyatakan apakah Anda ingin sensitivitas huruf, penyortiran angka, dan opsi lainnya.
Don Kirkby

2
@ sg28 Saya pikir Anda salah memahami penjelasan MDN. Itu tidak mengatakan bahwa fungsi semacam itu tidak dapat diandalkan , ia mengatakan bahwa itu tidak stabil . Saya mengerti mengapa ini bisa membingungkan, tetapi itu bukan klaim bahwa itu tidak cocok untuk digunakan. Dalam konteks algoritma pengurutan, istilah stabil memiliki arti khusus - bahwa elemen "sama" dalam daftar diurutkan dalam urutan yang sama seperti pada input . Ini sama sekali tidak terkait dengan ide kode yang tidak stabil (yaitu belum siap untuk digunakan).
Stobor

1
Jika Anda ingin mengurutkan berdasarkan nilai string tertentu misalnya dengan kota, Anda dapat menggunakan: this.homes.sort ((saat ini, selanjutnya) => {return current.city.localeCompare (next.city)});
Jorge Valvert

675

Berikut adalah versi yang lebih fleksibel, yang memungkinkan Anda untuk membuat fungsi pengurutan yang dapat digunakan kembali, dan mengurutkan berdasarkan bidang apa pun.

const sort_by = (field, reverse, primer) => {

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


//Now you can sort by any field at will...

const 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
console.log(homes.sort(sort_by('price', true, parseInt)));

// Sort by city, case-insensitive, A-Z
console.log(homes.sort(sort_by('city', false, (a) =>  a.toUpperCase()
)));


7
nickb - Anda salah membaca kode. sort_byberjalan di O (1), dan mengembalikan fungsi yang digunakan oleh sort bawaan (O (N log N)) untuk membandingkan item dalam daftar. Kompleksitas totalnya adalah O (n log n) * O (1) yang mereduksi menjadi O (n log n), atau sama dengan quick sort.
Triptych

1
Satu masalah yang saya miliki dengan ini adalah bahwa dengan reverse = false, ia akan mengurutkan angka sebagai 1,2,3,4 ... tetapi String sebagai z, y, x ...
Abby

4
Perangkat tambahan kecil:var key = primer ? function (x) { return primer(x[field]); } : function (x) { return x[field]; }
ErikE

6
Meski [1,-1][+!!reverse]terlihat keren, itu hal yang mengerikan untuk dilakukan. Jika seorang pengguna tidak dapat memanggil metode Anda dengan benar, menghukumnya, tidak mencoba untuk membuatnya masuk akal, apa pun yang terjadi.
Ingo Bürk

2
Bukankah lebih baik menyiapkan data sumber, ini akan menyebabkan penguraian berturut-turut ketika jelas sumber data perlu beberapa penyesuaian.
Gerrit Brink

134

Untuk mengurutkannya, Anda perlu membuat fungsi komparator dengan mengambil dua argumen. Kemudian panggil fungsi sortir dengan fungsi komparator sebagai berikut:

// a and b are object elements of your array
function mycomparator(a,b) {
  return parseInt(a.price, 10) - parseInt(b.price, 10);
}
homes.sort(mycomparator);

Jika Anda ingin mengurutkan, ganti ekspresi di setiap sisi tanda minus.


3
Dan inilah referensi yang benar-benar menjelaskan topik alih-alih mengatakan "terlalu rumit, Anda tidak akan memahaminya": developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Roland Illig

51

untuk penyortiran string jika seseorang membutuhkannya,

const dataArr = {

  "hello": [{
    "id": 114,
    "keyword": "zzzzzz",
    "region": "Sri Lanka",
    "supportGroup": "administrators",
    "category": "Category2"
  }, {
    "id": 115,
    "keyword": "aaaaa",
    "region": "Japan",
    "supportGroup": "developers",
    "category": "Category2"
  }]

};
const sortArray = dataArr['hello'];

console.log(sortArray.sort((a, b) => {
  if (a.region < b.region)
    return -1;
  if (a.region > b.region)
    return 1;
  return 0;
}));


38

Jika Anda memiliki browser yang sesuai dengan ES6, Anda dapat menggunakan:

Perbedaan antara urutan urutan naik dan turun adalah tanda nilai yang dikembalikan oleh fungsi perbandingan Anda:

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

Berikut cuplikan kode yang berfungsi:

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

homes.sort((a, b) => Number(a.price) - Number(b.price));
console.log("ascending", homes);

homes.sort((a, b) => Number(b.price) - Number(a.price));
console.log("descending", homes);


22

Anda ingin mengurutkannya dalam Javascript, bukan? Yang Anda inginkan adalah sort()fungsinya . Dalam hal ini Anda perlu menulis fungsi komparator dan meneruskannya sort(), jadi kira-kira seperti ini:

function comparator(a, b) {
    return parseInt(a["price"], 10) - parseInt(b["price"], 10);
}

var json = { "homes": [ /* your previous data */ ] };
console.log(json["homes"].sort(comparator));

Komparator Anda mengambil salah satu dari masing-masing hash bersarang di dalam array dan memutuskan mana yang lebih tinggi dengan memeriksa bidang "harga".


21

Saya merekomendasikan GitHub: Array sortBy - implementasi sortBymetode terbaik yang menggunakan transformasi Schwartzian

Tetapi untuk sekarang kita akan mencoba pendekatan ini Gist: sortBy-old.js .
Mari kita membuat metode untuk mengurutkan array yang dapat mengatur objek dengan beberapa properti.

Menciptakan fungsi penyortiran

var sortBy = (function () {
  var toString = Object.prototype.toString,
      // default parser function
      parse = function (x) { return x; },
      // gets the item to be sorted
      getItem = function (x) {
        var isObject = x != null && typeof x === "object";
        var isProp = isObject && this.prop in x;
        return this.parser(isProp ? x[this.prop] : x);
      };

  /**
   * Sorts an array of elements.
   *
   * @param  {Array} array: the collection to sort
   * @param  {Object} cfg: the configuration options
   * @property {String}   cfg.prop: property name (if it is an Array of objects)
   * @property {Boolean}  cfg.desc: determines whether the sort is descending
   * @property {Function} cfg.parser: function to parse the items to expected type
   * @return {Array}
   */
  return function sortby (array, cfg) {
    if (!(array instanceof Array && array.length)) return [];
    if (toString.call(cfg) !== "[object Object]") cfg = {};
    if (typeof cfg.parser !== "function") cfg.parser = parse;
    cfg.desc = !!cfg.desc ? -1 : 1;
    return array.sort(function (a, b) {
      a = getItem.call(cfg, a);
      b = getItem.call(cfg, b);
      return cfg.desc * (a < b ? -1 : +(a > b));
    });
  };

}());

Pengaturan data yang tidak disortir

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

Menggunakannya

Atur array, dengan "date"sebagaiString

// sort by @date (ascending)
sortBy(data, { prop: "date" });

// expected: first element
// { date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab" }

// expected: last element
// { date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa"}

Jika Anda ingin mengabaikan case sensitif, atur parsercallback:

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

Jika Anda ingin mengonversi "date"bidang sebagai Datetipe:

// sort by @date (descending) AS Date object
sortBy(data, {
    prop: "date",
    desc: true,
    parser: (d) => new Date(d)
});

// expected: first element
// { date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa"}

// expected: last element
// { date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab" }

Di sini Anda dapat bermain dengan kode: jsbin.com/lesebi

Berkat @Ozesh dengan umpan baliknya, masalah terkait properti dengan nilai falsy telah diperbaiki.


Ini tampaknya rusak ketika bidang adalah nol.
TSNev

Jika Anda menyortir angka dan Anda menemukan '0' di antara array objek, Anda mungkin memperhatikan bahwa kode di atas terputus .. Berikut adalah perbaikan cepat untuk itu: var checkNaN = function (value) { return Number.isNaN(Number(value)) ? 0 : value; } diikuti oleh: fungsi pengembalian (array, o) { .... a = _getItem.call (o, a); a = checkNaN (a); b = _getItem.call (o, b); b = checkNaN (b); return o.desc * (a <b? -1: + (a> b)); });
Ozesh

18

Gunakan lodash.sortBy , (instruksi menggunakan commonjs, Anda juga dapat cukup menaruh skrip-tag untuk cdn di bagian atas html Anda)

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

Urutan menurun

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

Urutan naik

var ascendingOrder = sortBy( homes, 'price' );

1
Atauconst sortBy = require('lodash/sortBy'); let calendars = sortBy(calendarListResponse.items, cal => cal.summary);
buka

tidak yakin apakah loadash berubah baru-baru ini sekarang bernama OrderByimport { orderBy } from 'lodash'; ... ... return orderBy ( rows, 'fieldName' ).reverse();
montelof

8

Ini bisa dicapai melalui fungsi satu baris valueof () sederhana . Jalankan cuplikan kode di bawah ini untuk melihat demo.

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

console.log("To sort descending/highest first, use operator '<'");

homes.sort(function(a,b) { return a.price.valueOf() < b.price.valueOf();});

console.log(homes);

console.log("To sort ascending/lowest first, use operator '>'");

homes.sort(function(a,b) { return a.price.valueOf() > b.price.valueOf();});

console.log(homes);


8

Saya sedikit terlambat untuk pesta tetapi di bawah ini adalah logika saya untuk menyortir.

function getSortedData(data, prop, isAsc) {
    return data.sort((a, b) => {
        return (a[prop] < b[prop] ? -1 : 1) * (isAsc ? 1 : -1)
    });
}

6

Sementara saya sadar bahwa OP ingin mengurutkan susunan angka, pertanyaan ini telah ditandai sebagai jawaban untuk pertanyaan serupa tentang string. Untuk itu, jawaban di atas tidak mempertimbangkan untuk menyortir array teks di mana casing penting. Sebagian besar jawaban mengambil nilai string dan mengubahnya menjadi huruf besar / kecil dan kemudian mengurutkan satu atau lain cara. Persyaratan yang saya patuhi sederhana:

  • Sortir secara alfabet AZ
  • Nilai huruf besar dari kata yang sama harus ada sebelum nilai huruf kecil
  • Nilai huruf yang sama (A / a, B / b) harus dikelompokkan bersama

Yang saya harapkan hanyalah [ A, a, B, b, C, c ]jawaban di atas kembali A, B, C, a, b, c. Saya benar-benar menggaruk kepala saya lebih lama dari yang saya inginkan (itulah sebabnya saya memposting ini dengan harapan akan membantu setidaknya satu orang lain). Sementara dua pengguna menyebutkan localeComparefungsi di komentar untuk jawaban yang ditandai, saya tidak melihat itu sampai setelah saya menemukan fungsi saat mencari-cari. Setelah membaca dokumentasi String.prototype.localeCompare () saya dapat menemukan ini:

var values = [ "Delta", "charlie", "delta", "Charlie", "Bravo", "alpha", "Alpha", "bravo" ];
var sorted = values.sort((a, b) => a.localeCompare(b, undefined, { caseFirst: "upper" }));
// Result: [ "Alpha", "alpha", "Bravo", "bravo", "Charlie", "charlie", "Delta", "delta" ]

Ini memberitahu fungsi untuk mengurutkan nilai huruf besar sebelum nilai huruf kecil. Parameter kedua dalam localeComparefungsi adalah untuk menentukan lokal tetapi jika Anda membiarkannya sebagaiundefined secara otomatis menentukan lokal untuk Anda.

Ini berfungsi sama untuk mengurutkan array objek juga:

var values = [
    { id: 6, title: "Delta" },
    { id: 2, title: "charlie" },
    { id: 3, title: "delta" },
    { id: 1, title: "Charlie" },
    { id: 8, title: "Bravo" },
    { id: 5, title: "alpha" },
    { id: 4, title: "Alpha" },
    { id: 7, title: "bravo" }
];
var sorted = values
    .sort((a, b) => a.title.localeCompare(b.title, undefined, { caseFirst: "upper" }));

5

Anda dapat menggunakan sortmetode JavaScript dengan fungsi callback:

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

4

Berikut ini adalah puncak dari semua jawaban di atas.

Validasi biola: http://jsfiddle.net/bobberino/4qqk3/

var sortOn = function (arr, prop, reverse, numeric) {

    // Ensure there's 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's from coming before smaller
    // e.g.
    // 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();

        }));
    }


}

dapatkah Anda jelaskan apa pentingnya memiliki * (rev? -1: 1);
TechTurtle

Itu untuk membalik urutan (naik vs turun) bagian rev hanya membalik hasil normal ketika argumen rev benar. Kalau tidak, itu hanya akan berlipat ganda dengan 1 yang tidak melakukan apa-apa, ketika diatur, itu akan mengalikan hasilnya dengan -1, sehingga membalikkan hasilnya.
bob

3

Untuk mengurutkan array, Anda harus mendefinisikan fungsi komparator. Fungsi ini selalu berbeda pada pola atau urutan penyortiran yang Anda inginkan (yaitu naik atau turun).

Mari kita buat beberapa fungsi yang mengurutkan array naik atau turun dan yang berisi objek atau string atau nilai numerik.

function sorterAscending(a,b) {
    return a-b;
}

function sorterDescending(a,b) {
    return b-a;
}

function sorterPriceAsc(a,b) {
    return parseInt(a['price']) - parseInt(b['price']);
}

function sorterPriceDes(a,b) {
    return parseInt(b['price']) - parseInt(b['price']);
}

Sortir angka (menurut abjad dan naik):

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

Sortir angka (menurut abjad dan turun):

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

Sortir angka (secara numerik dan naik):

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

Sortir angka (secara numerik dan menurun):

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

Seperti di atas gunakan metode sorterPriceAsc dan sorterPriceDes dengan array Anda dengan kunci yang diinginkan.

homes.sort(sorterPriceAsc()) or homes.sort(sorterPriceDes())

3

Saya juga bekerja dengan semacam pemeringkatan dan beberapa bidang:

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

Hasil

[
    {"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

Meskipun sedikit berlebihan untuk hanya mengurutkan satu array, fungsi prototipe ini memungkinkan untuk mengurutkan array Javascript dengan tombol apa saja, dalam urutan naik atau turun, termasuk kunci bersarang , menggunakan dotsintaks.

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

Pemakaian:

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

Menyortir berdasarkan properti bersarang dengan dot-sintaks atau sintaks-array:

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

Mengurutkan berdasarkan beberapa kunci:

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

Anda dapat membayar repo: https://github.com/eneko/Array.sortBy


Saya suka jawaban ini karena sortBysintaksis yang ringkas. Mudah digunakan –bahkan dengan bidang bersarang– sambil mempertahankan keterbacaan kode yang bagus. Terima kasih!
Manfred Urban

3

Dengan ECMAScript 6, jawaban StoBor dapat dilakukan dengan lebih ringkas:

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

3

Urutan harga menurun:

homes.sort((x,y) => {return y.price - x.price})

Urutan harga naik:

homes.sort((x,y) => {return x.price - y.price})

2

Jika Anda menggunakan Underscore.js , coba sortBy:

// price is of an integer type
_.sortBy(homes, "price"); 

// price is of a string type
_.sortBy(homes, function(home) {return parseInt(home.price);}); 

2

Berikut ini adalah versi implementasi elegan yang sedikit dimodifikasi dari buku "JavaScript: The Good Parts".

CATATAN : Versi byini stabil . Ini menjaga urutan jenis pertama saat melakukan jenis rantai berikutnya.

Saya telah menambahkan isAscendingparameter untuk itu. Juga dikonversi ke ES6standar dan bagian "baru" yang baik seperti yang direkomendasikan oleh penulis.

Anda bisa mengurutkan naik dan turun serta mengurutkan rantai berdasarkan beberapa properti.

const by = function (name, minor, isAscending=true) {
    const reverseMutliplier = isAscending ? 1 : -1;
    return function (o, p) {
        let a, b;
        let result;
        if (o && p && typeof o === "object" && typeof p === "object") {
            a = o[name];
            b = p[name];
            if (a === b) {
                return typeof minor === 'function' ? minor(o, p) : 0;
            }
            if (typeof a === typeof b) {
                result = a < b ? -1 : 1;
            } else {
                result = typeof a < typeof b ? -1 : 1;
            }
            return result * reverseMutliplier;
        } else {
            throw {
                name: "Error",
                message: "Expected an object when sorting by " + name
            };
        }
    };
};

let s = [
    {first: 'Joe',   last: 'Besser'},
    {first: 'Moe',   last: 'Howard'},
    {first: 'Joe',   last: 'DeRita'},
    {first: 'Shemp', last: 'Howard'},
    {first: 'Larry', last: 'Fine'},
    {first: 'Curly', last: 'Howard'}
];

// Sort by: first ascending, last ascending
s.sort(by("first", by("last")));    
console.log("Sort by: first ascending, last ascending: ", s);     // "[
//     {"first":"Curly","last":"Howard"},
//     {"first":"Joe","last":"Besser"},     <======
//     {"first":"Joe","last":"DeRita"},     <======
//     {"first":"Larry","last":"Fine"},
//     {"first":"Moe","last":"Howard"},
//     {"first":"Shemp","last":"Howard"}
// ]

// Sort by: first ascending, last descending
s.sort(by("first", by("last", 0, false)));  
console.log("sort by: first ascending, last descending: ", s);    // "[
//     {"first":"Curly","last":"Howard"},
//     {"first":"Joe","last":"DeRita"},     <========
//     {"first":"Joe","last":"Besser"},     <========
//     {"first":"Larry","last":"Fine"},
//     {"first":"Moe","last":"Howard"},
//     {"first":"Shemp","last":"Howard"}
// ]


Bisakah kita mengurutkan {"first":"Curly","last":"Howard", "property" : {"id" : "1"}}jenis array berdasarkan id?
Sahu V Kumar

ya, fungsinya harus sedikit dimodifikasi untuk mengambil parameter baru, katakanlah, nestedName. Anda kemudian memanggil bydengan nama = "properti", nestedName = "id"
mythicalcoder

2

Hanya untuk array normal dari nilai elemen:

function sortArrayOfElements(arrayToSort) {
    function compareElements(a, b) {
        if (a < b)
            return -1;
        if (a > b)
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareElements);
}

e.g. 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]

Untuk berbagai objek:

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

e.g. 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

Buat fungsi dan urutkan berdasarkan input menggunakan kode di bawah ini

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"

 }];

 function sortList(list,order){
     if(order=="ASC"){
        return list.sort((a,b)=>{
            return parseFloat(a.price) - parseFloat(b.price);
        })
     }
     else{
        return list.sort((a,b)=>{
            return parseFloat(b.price) - parseFloat(a.price);
        });
     }
 }

 sortList(homes,'DESC');
 console.log(homes);

2

Anda dapat menggunakan string1.localeCompare (string2) untuk perbandingan string

this.myArray.sort((a,b) => { 
    return a.stringProp.localeCompare(b.stringProp);
});

Perhatikan bahwa localComparecase dalam sensitif


1

Untuk mengurutkan pada beberapa objek objek array. Masukkan nama bidang Anda dalam arrproparray seperti ["a","b","c"] lalu masukkan parameter kedua arrsourcesumber aktual yang ingin kami urutkan.

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

1

Anda akan membutuhkan dua fungsi

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

Kemudian Anda bisa menerapkan ini pada properti objek apa pun:

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

let data = [
    {label: "one", value:10},
    {label: "two", value:5},
    {label: "three", value:1},
];

// sort functions
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;
}

// DESC
data.sort((a, b) => desc(a.value, b.value));

document.body.insertAdjacentHTML(
 'beforeend', 
 '<strong>DESCending sorted</strong><pre>' + JSON.stringify(data) +'</pre>'
);

// ASC
data.sort((a, b) => asc(a.value, b.value));

document.body.insertAdjacentHTML(
 'beforeend', 
 '<strong>ASCending sorted</strong><pre>' + JSON.stringify(data) +'</pre>'
);


0

Baru-baru ini saya menulis fungsi universal untuk mengelola ini untuk Anda jika Anda ingin menggunakannya.

/**
 * Sorts an object into an order
 *
 * @require jQuery
 *
 * @param object Our JSON object to sort
 * @param type Only alphabetical at the moment
 * @param identifier The array or object key to sort by
 * @param order Ascending or Descending
 *
 * @returns Array
 */
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
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

Hai setelah membaca artikel ini, saya membuat sortComparator untuk kebutuhan saya, dengan fungsionalitas untuk membandingkan lebih dari satu atribut json, dan saya ingin membaginya dengan Anda.

Solusi ini hanya membandingkan string dalam urutan menaik, tetapi solusinya dapat dengan mudah diperluas untuk setiap atribut yang didukung: pemesanan terbalik, tipe data lainnya, untuk menggunakan lokal, casting, dll.

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"

}];

// comp = array of attributes to sort
// comp = ['attr1', 'attr2', 'attr3', ...]
function sortComparator(a, b, comp) {
    // Compare the values of the first attribute
    if (a[comp[0]] === b[comp[0]]) {
        // if EQ proceed with the next attributes
        if (comp.length > 1) {
            return sortComparator(a, b, comp.slice(1));
        } else {
            // if no more attributes then return EQ
            return 0;
        }
    } else {
        // return less or great
        return (a[comp[0]] < b[comp[0]] ? -1 : 1)
    }
}

// Sort array homes
homes.sort(function(a, b) {
    return sortComparator(a, b, ['state', 'city', 'zip']);
});

// display the array
homes.forEach(function(home) {
    console.log(home.h_id, home.city, home.state, home.zip, home.price);
});

dan hasilnya

$ node sort
4 Bevery Hills CA 90210 319250
5 New York NY 00010 962500
3 Dallas TX 75201 162500

dan jenis lainnya

homes.sort(function(a, b) {
    return sortComparator(a, b, ['city', 'zip']);
});

dengan hasil

$ node sort
4 Bevery Hills CA 90210 319250
3 Dallas TX 75201 162500
5 New York NY 00010 962500

0

Kode sederhana:

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

    let sortByPrice = homes.sort(function (a, b) 
    {
      return parseFloat(b.price) - parseFloat(a.price);
    });

    for (var i=0; i<sortByPrice.length; i++)
    {
      document.write(sortByPrice[i].h_id+' '+sortByPrice[i].city+' '
       +sortByPrice[i].state+' '
       +sortByPrice[i].zip+' '+sortByPrice[i].price);
      document.write("<br>");
    }


0
 function compareValues(key, order = 'asc') {
  return function innerSort(a, b) {
    if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
      // property doesn't exist on either object
      return 0;
    }

    const varA = (typeof a[key] === 'string')
      ? a[key].toUpperCase() : a[key];
    const varB = (typeof b[key] === 'string')
      ? b[key].toUpperCase() : b[key];

    let comparison = 0;
    if (varA > varB) {
      comparison = 1;
    } else if (varA < varB) {
      comparison = -1;
    }
    return (
      (order === 'desc') ? (comparison * -1) : comparison
    );
  };
}

http://yazilimsozluk.com/sort-array-in-javascript-by-asc-or-desc

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.