4000 Stimmen

Array von Objekten nach String-Eigenschaftswert sortieren

Ich habe ein Array von JavaScript-Objekten:

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

Wie kann ich sie nach dem Wert von last_nom in JavaScript?

Ich weiß von sort(a,b) aber das scheint nur bei Strings und Zahlen zu funktionieren. Muss ich ein toString() Methode für meine Objekte?

8 Stimmen

Mit diesem Skript können Sie genau das tun, es sei denn, Sie möchten Ihre eigene Vergleichsfunktion oder Ihren eigenen Sortierer schreiben: thomasfrank.se/sortierung_der-dinge.html

0 Stimmen

Der schnellste Weg ist die Verwendung der isomorphen sort-array Modul, das nativ sowohl im Browser als auch im Node funktioniert und jede Art von Eingabe, berechnete Felder und benutzerdefinierte Sortierreihenfolgen unterstützt.

0 Stimmen

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

10voto

Sridhar Sg Punkte 1356

Mit Ramda,

npm install ramda

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)

0 Stimmen

Was ist Ramda? Können Sie hinzufügen. einen Verweis darauf (z. B. einen (nicht nackten) Link)? (Aber ******* ohne ******* "Bearbeiten:", "Aktualisieren:" oder ähnlich - die Antwort sollte so aussehen, als wäre sie heute geschrieben worden).

10voto

Burak Keceli Punkte 883

Möglicherweise müssen Sie sie in Kleinbuchstaben umwandeln, um Verwechslungen vorzubeugen.

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

})

9voto

Evgenii Punkte 3006
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"));

2 Stimmen

Bitte überlegen Sie, ob Sie Ihren Beitrag so bearbeiten, dass er mehr Erklärungen darüber enthält, was Ihr Code tut und warum er das Problem lösen wird. Eine Antwort, die größtenteils nur Code enthält (selbst wenn er funktioniert), hilft dem Auftraggeber normalerweise nicht, sein Problem zu verstehen.

9voto

Nur Punkte 2108

Sie können eine wiederverwendbare Sortierfunktion verwenden.

Array.prototype.order = function (prop, methods = {}) {
    if (prop?.constructor == Object) {
        methods = prop;
        prop = null;
    }
    const [orderType_a, orderType_b] = methods.reverse ? [1, -1] : [-1, 1];

    const $ = x => prop
        ? methods.insensitive
            ? String(x[prop]).toLowerCase()
            : x[prop]
        : methods.insensitive
            ? String(x).toLowerCase()
            : x;

    const fn = (a, b) => $(a) < $(b) ? orderType_a : $(b) < $(a) ? orderType_b : 0;
    return this.sort(fn);
};

Es kann sowohl zum Sortieren Array y Objekt in Reihe
.

let items = [{ x: "Z" }, 3, "1", "0", 2, { x: "a" }, { x: 0 }];
items
    .order("x", { insensitive: 1 })
    // [ { x: 0 }, { x: 'a' }, 3, '1', '0', 2, { x: 'Z' } ]
    .order({ reverse: 1 })
    // [ { x: 0 }, { x: 'a' }, 3, 2, { x: 'Z' }, '1', '0' ]
    .sort(x => typeof x == "string" || typeof x == "number" ? -1 : 0)
    // [ '0', '1', 2, 3, { x: 0 }, { x: 'a' }, { x: 'Z' } ]

1. (fakultativ) > zum Sortieren der im Array enthaltenen Objekte.
2. ist Methode > { reverse: any, insensitive: any }

8voto

Gil Epshtain Punkte 7072

Dies ist ein einfaches Problem, ich weiß nicht, warum die Leute eine so komplexe Lösung haben.
Eine einfache Sortierfunktion (basierend auf Schnellsortierung Algorithmus):

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

Beispiel verwenden:

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

6 Stimmen

Wie ist die Implementierung von quick sort in js eine einfache Lösung? Einfacher Algorithmus, aber keine einfache Lösung.

0 Stimmen

Es ist einfach, da es keine äußeren Bibliotheken verwendet und den Prototyp des Objekts nicht verändert. Meiner Meinung nach hat die Länge des Codes keinen direkten Einfluss auf die Komplexität des Codes

3 Stimmen

Lassen Sie es mich mit anderen Worten versuchen: Wie kann es eine einfache Lösung sein, das Rad neu zu erfinden?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X