Bir nesne dizisini özellik değerlerine göre sıralama


1332

AJAX kullanarak aşağıdaki nesneleri var ve bunları bir dizide sakladım:

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

Nesneleri priceözelliğe göre yalnızca JavaScript kullanarak artan veya azalan düzende sıralamak için bir işlev nasıl oluştururum ?


en hızlı yol, hem tarayıcıda hem de düğümde yerel olarak çalışan, her türlü girişi, hesaplanan alanları ve özel sıralama düzenlerini destekleyen izomorfik sıralama dizisi modülünü kullanmaktır .
Lloyd

Yanıtlar:


1674

Evleri artan sırayla fiyata göre sıralayın:

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

Veya ES6 sürümünden sonra:

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

Bazı belgeleri burada bulabilirsiniz .


182
string1.localeCompare(string2)Dize karşılaştırması için kullanabilirsiniz
bradvido

62
Büyük / localeCompare()küçük harfe duyarsız olduğunu unutmayın . Büyük / küçük harfe duyarlı olmasını istiyorsanız kullanabilirsiniz (string1 > string2) - (string1 < string2). Boole değerleri, farkı hesaplamak için 0 ve 1 tamsayısına zorlanır.
Don Kirkby

2
Güncelleme için teşekkürler, @Pointy, bu sorunla karşılaştığımı hatırlamıyorum, ancak belki de son birkaç yılda davranış değişti. Ne olursa olsun, localeCompare()belgeler büyük / küçük harf duyarlılığı, sayısal sıralama ve diğer seçenekleri isteyip istemediğinizi açıkça belirtebileceğinizi gösterir.
Don Kirkby

2
@ sg28 Sanırım MDN açıklamasını yanlış anladınız. Sıralama işlevinin güvenilir olmadığını söylemez, kararlı olmadığını söyler . Bunun neden kafa karıştırıcı olabileceğini anlıyorum, ancak bu kullanım için uygun olmadığı iddiası değil. Sıralama algoritmaları bağlamında, kararlı terimin belirli bir anlamı vardır - listedeki "eşit" öğelerin giriş ile aynı sırada sıralandığı . Bu, kararsız olan (yani henüz kullanıma hazır olmayan) kod fikri ile tamamen ilgisizdir.
Stobor

1
Örneğin şehre göre belirli bir dize değerlerine göre sıralamak isterseniz şunları kullanabilirsiniz: this.homes.sort ((current, next) => {return current.city.localeCompare (next.city)});
Jorge Valvert

675

Yeniden kullanılabilir sıralama işlevleri oluşturmanıza ve herhangi bir alana göre sıralamanıza izin veren daha esnek bir sürüm.

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 - kodu yanlış okuyorsunuz. sort_byO (1) ile çalışır ve bir listedeki öğeleri karşılaştırmak için yerleşik sıralama (O (N log N)) tarafından kullanılan bir işlevi döndürür. Toplam karmaşıklık O (n log n) * O (1) 'dir ve O (n log n)' ye veya hızlı bir sıralama ile aynıdır.
Triptik

1
Bununla var bir husus, ters = false ile, bu 1,2,3,4 olarak sıralamasını ... ama olmasıdır Strings z, y, x'in ... olarak
Abby

4
Küçük bir gelişme:var key = primer ? function (x) { return primer(x[field]); } : function (x) { return x[field]; }
ErikE

6
İken [1,-1][+!!reverse]görünüyor serin, bunu yapmak için korkunç bir şey. Bir kullanıcı yönteminizi düzgün bir şekilde arayamazsa, onu cezalandırın, ne olursa olsun, bir şekilde anlamlandırmaya çalışmayın.
Ingo Bürk

2
Kaynak verileri hazırlamak daha iyi olmaz mıydı, bu, kaynak verilerin açıkça ayarlanması gerektiğinde ardışık ayrışmaya neden olur.
Gerrit Brink

134

Bunu sıralamak için iki argüman alan bir karşılaştırıcı işlevi oluşturmanız gerekir. Ardından bu karşılaştırma işleviyle sıralama işlevini aşağıdaki gibi çağırın:

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

Artan olarak sıralamak isterseniz, eksi işaretinin her iki yanındaki ifadeleri değiştirin.


3
Ve işte konuyu "çok karmaşık, yine de anlamayacaksınız" yerine açıklayan bir referans: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Roland Illig

51

bazılarının ihtiyaç duyması durumunda dize sıralama için,

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

Bir varsa ES6 uygun bir tarayıcıyı kullanabilirsiniz:

Artan ve azalan sıralama düzeni arasındaki fark, karşılaştırma işleviniz tarafından döndürülen değerin işaretidir:

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

İşte çalışan bir kod snippet'i:

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

Javascript'te sıralamak istiyorsunuz, değil mi? İstediğiniz sort()fonksiyon . Bu durumda, bir karşılaştırıcı işlevi yazmanız ve bunu iletmeniz gerekir sort(), böylece böyle bir şey:

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

Karşılaştırıcınız dizi içindeki iç içe karma değerlerden birini alır ve "fiyat" alanını kontrol ederek hangisinin daha yüksek olduğuna karar verir.


21

GitHub'u tavsiye ederim : Array sortBy - Schwartz dönüşümünüsortBy kullanan en iyi yöntem uygulaması

Ama şimdilik bu yaklaşımı deneyeceğiz Gist: sortBy-old.js .
Nesneleri bir özelliğe göre düzenleyebilecek dizileri sıralamak için bir yöntem oluşturalım.

Sıralama işlevini oluşturma

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

}());

Sıralanmamış verileri ayarlama

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

Kullanma

Tarafından, dizi düzenlemek "date"olarakString

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

Büyük / küçük harfe duyarlılığı yoksaymak istiyorsanız parsergeri aramayı ayarlayın :

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

"date"Alanı Datetür olarak dönüştürmek istiyorsanız :

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

Burada kodu ile oynayabilirsiniz: jsbin.com/lesebi

Sayesinde @Ozesh onun görüşlerinden ile mal varlığıyla ilgili bir sorun falsy değerler giderilmiştir.


Bir alan boş olduğunda bu kırılıyor gibi görünüyor.
TSNev

Sayılar arasında sıralama yapıyorsanız ve nesne dizisi arasında bir '0' ile karşılaşırsanız, yukarıdaki kodun bozulduğunu fark edebilirsiniz .. İşte bunun için hızlı bir düzeltme: var checkNaN = function (value) { return Number.isNaN(Number(value)) ? 0 : value; } ardından: return işlevi (dizi, o) { .... a = _getItem.call (o, a); a = checkNaN (a); b = _getItem.call (o, b); b = checkNaN (b); dönüş o.desc * (a <b? -1: + (a> b)); });
Ozesh

18

Lodash.sortBy'yi kullanın ( commonjs kullanan talimatlar, sadece html'nizin üst kısmındaki cdn için script include-etiketi koyabilirsiniz )

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

Azalan sipariş

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

Artan düzen

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

1
Veyaconst sortBy = require('lodash/sortBy'); let calendars = sortBy(calendarListResponse.items, cal => cal.summary);
16:13, mpen

loadash son zamanlarda şu import { orderBy } from 'lodash'; ... ... return orderBy ( rows, 'fieldName' ).reverse();
anki

8

Bu basit bir satırlık valueeof () sıralama fonksiyonu ile başarılmış olabilir . Demoyu görmek için kod snippet'ini çalıştırın.

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

Partiye biraz geç kaldım ama aşağıda sıralama mantığım.

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

6

Ben OP bir sayı dizisini sıralamak istediğini bilsem de, bu soru dizeleri ile ilgili benzer soruların cevabı olarak işaretlenmiştir. Bu nedenle, yukarıdaki cevaplar, gövdenin önemli olduğu bir metin dizisini sıralamayı düşünmemektedir. Çoğu yanıt dize değerlerini alır ve bunları büyük / küçük harfe dönüştürür ve sonra bir şekilde sıralar. Uyduğum gereksinimler basit:

  • A'dan Z'ye alfabetik olarak sırala
  • Aynı kelimenin büyük harf değerleri küçük harflerden önce gelmelidir
  • Aynı harf (A / a, B / b) değerleri birlikte gruplandırılmalıdır

Ne bekliyorum [ A, a, B, b, C, c ]ama yukarıdaki cevaplar dönüyor A, B, C, a, b, c. Aslında başımı istediğimden daha uzun süre çizdim (bu yüzden bunu en az bir kişiye yardımcı olacağı umuduyla gönderiyorum). İki kullanıcı localeCompare, işaretli cevap için yorumlarda işlevden bahsederken, etrafta arama yaparken işleve rastlayana kadar görmedim. String.prototype.localeCompare () belgelerini okuduktan sonra bu ile geldim:

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

Bu, işleve büyük harf değerlerini küçük harf değerlerinden önce sıralamasını söyler. İşlevdeki ikinci parametre localeCompareyerel ayarı tanımlamaktır, ancak bunu bırakırsanız yerel ayarı sizin undefinediçin otomatik olarak bulur.

Bu, bir dizi nesneyi sıralamak için de aynı şekilde çalışır:

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

JavaScript sortyöntemini geri arama işleviyle kullanabilirsiniz:

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

İşte yukarıdaki tüm cevapların doruk noktası.

Keman doğrulaması: 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();

        }));
    }


}

* (rev? -1: 1) 'in öneminin ne olduğunu açıklayabilir misiniz?
TechTurtle

Bu ters sırayı tersine çevirmek (artan veya azalan), rev kısmı doğru olduğunda normal kısmı ters çevirir. Aksi takdirde, sadece 1 ile çarpılır, bu da hiçbir şey yapmaz, ayarlandığında sonucu -1 ile çarpar ve böylece sonucu tersine çevirir.
bob

3

Ben de bir tür derece ve birden çok alan sıralama ile çalıştı:

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

Sonuç

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

Sadece tek bir diziyi sıralamak için biraz fazlalık olsa da, bu prototip işlevi, Javascript dizilerini sözdizimi kullanarak iç içe anahtarlar dahil olmak üzere artan veya azalan sırada herhangi bir tuşa göre sıralamaya izin verir dot.

(function(){
    var keyPaths = [];

    var saveKeyPath = function(path) {
        keyPaths.push({
            sign: (path[0] === '+' || path[0] === '-')? parseInt(path.shift()+1) : 1,
            path: path
        });
    };

    var valueOf = function(object, path) {
        var ptr = object;
        for (var i=0,l=path.length; i<l; i++) ptr = ptr[path[i]];
        return ptr;
    };

    var comparer = function(a, b) {
        for (var i = 0, l = keyPaths.length; i < l; i++) {
            aVal = valueOf(a, keyPaths[i].path);
            bVal = valueOf(b, keyPaths[i].path);
            if (aVal > bVal) return keyPaths[i].sign;
            if (aVal < bVal) return -keyPaths[i].sign;
        }
        return 0;
    };

    Array.prototype.sortBy = function() {
        keyPaths = [];
        for (var i=0,l=arguments.length; i<l; i++) {
            switch (typeof(arguments[i])) {
                case "object": saveKeyPath(arguments[i]); break;
                case "string": saveKeyPath(arguments[i].match(/[+-]|[^.]+/g)); break;
            }
        }
        return this.sort(comparer);
    };    
})();

Kullanımı:

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

Nokta sözdizimi veya dizi sözdizimi ile iç içe özelliklere göre sıralama:

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

Birden çok tuşa göre sıralama:

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

Repoyu çatallayabilirsiniz: https://github.com/eneko/Array.sortBy


sortByÖzlü sözdizimi nedeniyle bu yanıtı çok seviyorum . Mükemmel kod okunabilirliğini korurken, iç içe geçmiş alanlarla bile kullanımı kolaydır. Teşekkür ederim!
Manfred Urban

3

ECMAScript 6 ile StoBor'un cevabı daha da özlü yapılabilir:

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

3

Azalan fiyat sırası:

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

Artan fiyat sırası:

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

2

Bir diziyi sıralamak için bir karşılaştırma işlevi tanımlamanız gerekir. Bu işlev, istediğiniz sıralama düzeninde veya düzeninde (örneğin artan veya azalan) her zaman farklı olabilir.

Bir diziyi artan veya azalan şekilde sıralayan ve nesne, dize veya sayısal değerler içeren bazı işlevler oluşturalım.

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

Sayıları sıralayın (alfabetik ve artan):

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

Sayıları sıralama (alfabetik ve azalan):

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

Sayıları sıralama (sayısal ve artan):

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

Sayıları sıralama (sayısal ve azalan):

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

Yukarıdaki gibi, dizinizle istediğiniz anahtarla sorterPriceAsc ve sorterPriceDes yöntemini kullanın.

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

2

Underscore.js kullanıyorsanız sortBy'yi deneyin:

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

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

2

İşte "JavaScript: İyi Parçalar" kitabından zarif uygulamanın biraz değiştirilmiş bir versiyonu.

NOT : bu sürümü byis kararlı . Sonraki zincirleme sıralamayı yaparken ilk sıralamanın sırasını korur.

isAscendingParametre ekledim . Ayrıca ES6yazar tarafından önerilen standartlara ve "daha yeni" iyi parçalara dönüştürdü .

Birden çok özelliğe göre artan ve azalan ve zincir sıralamayı sıralayabilirsiniz.

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


{"first":"Curly","last":"Howard", "property" : {"id" : "1"}}dizi türünü kimliğe göre sıralayabilir miyiz ?
Vishal Kumar Sahu

evet, yeni bir parametre, örneğin nestedName almak için işlev biraz değiştirilmelidir. Daha sonra byname = "property", nestedName = "id" ile çağrı yaparsınız
mythicalcoder

2

Yalnızca normal öğe değerleri dizisi için:

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]

Bir nesne dizisi için:

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

Bir fonksiyon oluşturun ve aşağıdaki kodu kullanarak girişe göre sıralayın

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

Dize karşılaştırması için string1.localeCompare (string2) kullanabilirsiniz

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

Not localComparedurumdur içinde hassas


1

Birden çok dizi nesnesi alanında sıralama için. Alan adınızı arrpropdiziye girin ve sıralamak istediğimiz ["a","b","c"] ikinci parametreyi arrsourcegerçek kaynağa iletin.

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

İki işleve ihtiyacınız olacak

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

Sonra bunu herhangi bir object özelliğine uygulayabilirsiniz:

 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

Son zamanlarda kullanmak istiyorsanız bunu sizin için yönetmek için evrensel bir işlev yazdım.

/**
 * 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

Merhaba bu makaleyi okuduktan sonra, birden fazla json özniteliklerini karşılaştırmak için işlevsellik ile, benim ihtiyaçları için bir sortComparator yaptı ve ben sizinle paylaşmak istiyorum.

Bu çözüm yalnızca dizeleri artan sırada karşılaştırır, ancak çözüm her özelliğin desteklenmesi için kolayca genişletilebilir: ters sıralama, diğer veri türleri, yerel ayarları kullanmak, döküm vb.

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

ve sonuç

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

ve başka tür

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

sonuç ile

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

0

Basit bir kod:

    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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.