2017-07-17 8 views
0

So theres Tonnen Beiträge auf so etwas wie diese Sortierung:Spezielle Sortierung eines Arrays von Objekten

var arr = [{a: 1}, {b: 2}] alphabetisch nach Schlüssel, aber was ist, wenn Sie so etwas wie var arr = [{a: 100}, {a: 50}] haben, was ich will, ist dann zu sagen „oh du‘ ? re derselben können sortieren Sie dann von Wert (das ist immer eine Zahl sein wird)

ich bin nicht sicher, wie entweder in lodash oder ähnliche Javascript Art und Weise zu tun

Das Endergebnis sollte entweder sein..:

[{b: 2}, {a: 1}] // Keys are different (alphabetical) 
// or: 
[{a: 50}, {a: 100}] // Keys are the same (lowest to highest) 

Alles, was ich auf Stack-Overflow gesehen habe, wird ein schnelles Chaos (Code-weise), und ich dachte, es gibt Sortiermethoden auf lodash, aber wie genau erreiche ich, was ich unter den gegebenen Umständen will ??

Irgendwelche Ideen?

Jemand hat eine gute Frage gestellt, gibt es mehr Schlüssel? Sind sie nur a und b?

Es gibt nur zwei Objekte in diesem Array zu einem bestimmten Zeitpunkt und ja die Schlüssel wären immer nur Strings, in diesem Fall könnten die Strings alles sein, Katze, Hund, Maus, Apfel, Banane ... Was? je.

Die Werte werden immer nur Zahlen sein.

die Luft Clearing

Wenn die Schlüssel übereinstimmen, sortieren nur das Array von Wert, wenn die Schlüssel nicht übereinstimmen, nur durch Taste, um das Array sortieren. Es werden immer nur zwei Objekte in diesem Array sein. Entschuldigung für das Missverständnis.

+0

Gibt es nur 'a' und 'b' Schlüssel? Oder sind Schlüssel vor dem Sortieren bekannt? –

+0

Was passiert, wenn das Objekt mehr Schlüssel/Wert-Paare enthält?Welcher Schlüssel wird dann ausgewählt? –

+0

@ibrahimmahrir Der Beitrag wurde aktualisiert. Es gibt immer nur zwei, der Schlüssel ist immer ein String (ein gültiges Wort) und der Wert ist immer eine Zahl. – TheWebs

Antwort

1

Sie können nur eine Funktion verwenden, die zwei Arten von Sortier (funktioniert für Ihren Fall durchzuführen, in dem Sie nur ein Array mit zwei Elementen, aber es ist vollständig generisch in Bezug auf die Array-Länge):

var arr1 = [{a: 30}, {a: 2}]; 
 
var arr2 = [{b: 30}, {a: 2}]; 
 

 
function sortArr(arr) { 
 
    return arr.sort((a, b) => { 
 
    var aKey = Object.keys(a)[0]; 
 
    var bKey = Object.keys(b)[0]; 
 

 
    return (aKey !== bKey) ? aKey.localeCompare(bKey) : a[aKey] - b[bKey]; 
 
    }); 
 
} 
 

 
var sortedArr1 = sortArr(arr1); 
 
var sortedArr2 = sortArr(arr2); 
 

 
console.log(sortedArr1); 
 
console.log(sortedArr2);

1

Falls Sie immer eine Eigenschaft in Ihren Objekten haben, können Sie zuerst nach key mit localeCompare und dann nach Wert dieser Eigenschaft sortieren.

var arr = [{b: 2}, {b: 10}, {a: 1}, {c: 1}, {a: 20}] 
 

 
arr.sort(function(a, b) { 
 
    var kA = Object.keys(a)[0] 
 
    var kB = Object.keys(b)[0] 
 
    return kA.localeCompare(kB) || a[kA] - b[kB] 
 
}) 
 

 
console.log(arr)

Vor dem Sortieren Sie Reihe von einzigartigen Schlüssel erstellen können, die Sie, wenn alle Objekt indem Sie den gleichen Schlüssel haben zu prüfen, verwenden können, wenn die Länge> 1 ist und diese Funktion in Art verwenden.

var arr = [{b: 10}, {b: 2}, {a: 1}, {c: 1}, {a: 20}, {b: 22}] 
 
var arr2 = [{a: 10}, {a: 2}, {a: 1}, {a: 22}] 
 

 

 
function customSort(data) { 
 
    var keys = [...new Set([].concat(...data.map(e => Object.keys(e))))] 
 

 
    data.sort(function(a, b) { 
 
    var kA = Object.keys(a)[0] 
 
    var kB = Object.keys(b)[0] 
 

 
    return keys.length > 1 ? kA.localeCompare(kB) : a[kA] - b[kB] 
 
    }) 
 

 
    return data; 
 
} 
 

 
console.log(customSort(arr)) 
 
console.log(customSort(arr2))

+0

Während ich diese Antwort mögen Sie sortieren nach Schlüssel und dann nach Wert, es muss entweder sein oder, zum Beispiel, wenn die Schlüssel übereinstimmen, nur nach Wert sortieren, wenn die Schlüssel nicht übereinstimmen nur nach Schlüsseln sortieren. Ich hätte klarer sein sollen - ich entschuldige mich. Ich habe meinen Beitrag aktualisiert, um dies zu berücksichtigen. – TheWebs

+0

Also, wenn die Schlüssel nicht die gleichen sind, möchten Sie nicht auch nach Wert sortieren? –

+0

@TheWebs diese Antwort tut genau das. Wenn 'localeCompare'' 0' zurückgibt (bedeutet, dass sie denselben Schlüssel haben), sollten wir nach Wert sortieren. 'a [kA] - b [kB]' wird nicht ausgewertet, außer 'a' und' b' haben den gleichen Schlüssel. –

0

var arr = [{b: 2}, {a: 1}, {b: 1}, {a: 100}, {a: 20}]; 
 

 
arr.sort(function(a, b) { 
 
    var aKey = a.hasOwnProperty("a")? "a": "b", // get the first object key (if it has the property "a" then its key is "a", otherwise it's "b") 
 
     bKey = b.hasOwnProperty("a")? "a": "b"; // same for the second object 
 
     
 
    return aKey === bKey?      // if the keys are equal 
 
      a[aKey] - b[aKey]:     // then sort the two objects by the value of that key (stored in either aKey or bKey) 
 
      aKey.localeCompare(bKey);   // otherwise sort by the strings aKey and bKey (the keys of the two objects) 
 
}); 
 

 
console.log(arr);

+0

Betrachtet man die beiden Argumente der Sorte Callback 'a' und' b' und die Eigenschaften 'a' und' b' 'scheint ein wenig verwirrend. Ich hoffe es ist klar :). –

Verwandte Themen