379 Stimmen

Array von Objekten nach einem einzelnen Schlüssel mit Datumswert sortieren

Ich habe ein Array von Objekten mit mehreren Schlüssel-Wert-Paaren, und ich muss sie basierend auf "updated_at" sortieren:

[
    {
        "updated_at" : "2012-01-01T06:25:24Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-09T11:25:13Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-05T04:13:24Z",
        "foo" : "bar"
    }
]

Was ist der effizienteste Weg, dies zu tun?

3voto

Ishpreet Punkte 4262

Als Diese Zustände der Antwort, können Sie Array.sort .

arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)})

arr = [
    {
        "updated_at" : "2012-01-01T06:25:24Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-09T11:25:13Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-05T04:13:24Z",
        "foo" : "bar"
    }
];
arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)});
console.log(arr);

3voto

Chetan Punkte 134

Sie könnten die Lodash Hilfsbibliothek, um dieses Problem zu lösen (es ist eine recht effiziente Bibliothek):

const data = [{
    "updated_at": "2012-01-01T06:25:24Z",
    "foo": "bar"
  },
  {
    "updated_at": "2012-01-09T11:25:13Z",
    "foo": "bar"
  },
  {
    "updated_at": "2012-01-05T04:13:24Z",
    "foo": "bar"
  }
]

const ordered = _.orderBy(
  data,
  function(item) {
    return item.updated_at;
  }
);

console.log(ordered)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

Die Dokumentation finden Sie hier: https://lodash.com/docs/4.17.15#orderBy

1voto

aljgom Punkte 6035

Damit können wir eine Schlüsselfunktion übergeben, die für die Sortierung verwendet wird

Array.prototype.sortBy = function(key_func, reverse=false){
    return this.sort( (a, b) => {
        var keyA = key_func(a),
            keyB = key_func(b);
        if(keyA < keyB) return reverse? 1: -1;
        if(keyA > keyB) return reverse? -1: 1;
        return 0;
    }); 
}

Wenn wir also zum Beispiel Folgendes haben

var arr = [ {date: "01/12/00", balls: {red: "a8",  blue: 10}},
            {date: "12/13/05", balls: {red: "d6" , blue: 11}},
            {date: "03/02/04", balls: {red: "c4" , blue: 15}} ]

Wir können

arr.sortBy(el => el.balls.red)
/* would result in
[ {date: "01/12/00", balls: {red: "a8", blue: 10}},
  {date: "03/02/04", balls: {red: "c4", blue: 15}},
  {date: "12/13/05", balls: {red: "d6", blue: 11}} ]
*/

oder

arr.sortBy(el => new Date(el.date), true)   // second argument to reverse it
/* would result in
[ {date: "12/13/05", balls: {red: "d6", blue:11}},
  {date: "03/02/04", balls: {red: "c4", blue:15}},
  {date: "01/12/00", balls: {red: "a8", blue:10}} ]
*/

oder

arr.sortBy(el => el.balls.blue + parseInt(el.balls.red[1]))
/* would result in
[ {date: "12/13/05", balls: {red: "d6", blue:11}},    // red + blue= 17
  {date: "01/12/00", balls: {red: "a8", blue:10}},    // red + blue= 18
  {date: "03/02/04", balls: {red: "c4", blue:15}} ]   // red + blue= 19
*/

1voto

marcobiedermann Punkte 2837
  • Utilice Array.sort() zum Sortieren eines Arrays
  • Array klonen mit Spread-Operator ( ), um die Funktion rein zu machen
  • Sortieren nach gewünschtem Schlüssel ( updated_at )
  • Datumsstring umwandeln in Datumsobjekt
  • Array.sort() funktioniert durch Subtraktion zweier Eigenschaften vom aktuellen und nächsten Element, wenn es sich um eine Zahl / ein Objekt handelt, auf dem Sie arrhythmische Operationen durchführen können

    const input = [ { updated_at: '2012-01-01T06:25:24Z', foo: 'bar', }, { updated_at: '2012-01-09T11:25:13Z', foo: 'bar', }, { updated_at: '2012-01-05T04:13:24Z', foo: 'bar', } ];

    const sortByUpdatedAt = (items) => [...items].sort((itemA, itemB) => new Date(itemA.updated_at) - new Date(itemB.updated_at));

    const output = sortByUpdatedAt(input);

    console.log(input); / [ { updated_at: '2012-01-01T06:25:24Z', foo: 'bar' }, { updated_at: '2012-01-09T11:25:13Z', foo: 'bar' }, { updated_at: '2012-01-05T04:13:24Z', foo: 'bar' } ] / console.log(output) / [ { updated_at: '2012-01-01T06:25:24Z', foo: 'bar' }, { updated_at: '2012-01-05T04:13:24Z', foo: 'bar' }, { updated_at: '2012-01-09T11:25:13Z', foo: 'bar' } ] /

1voto

Ansuman Punkte 1356

Ich habe eine Sortierfunktion in Typescript erstellt, mit der wir Strings, Daten und Zahlen in einem Array von Objekten suchen können. Sie kann auch nach mehreren Feldern sortieren.

export type SortType = 'string' | 'number' | 'date';
export type SortingOrder = 'asc' | 'desc';

export interface SortOptions {
  sortByKey: string;
  sortType?: SortType;
  sortingOrder?: SortingOrder;
}

class CustomSorting {
    static sortArrayOfObjects(fields: SortOptions[] = [{sortByKey: 'value', sortType: 'string', sortingOrder: 'desc'}]) {
        return (a, b) => fields
          .map((field) => {
            if (!a[field.sortByKey] || !b[field.sortByKey]) {
              return 0;
            }

            const direction = field.sortingOrder === 'asc' ? 1 : -1;

            let firstValue;
            let secondValue;

            if (field.sortType === 'string') {
              firstValue = a[field.sortByKey].toUpperCase();
              secondValue = b[field.sortByKey].toUpperCase();
            } else if (field.sortType === 'number') {
              firstValue = parseInt(a[field.sortByKey], 10);
              secondValue = parseInt(b[field.sortByKey], 10);
            } else if (field.sortType === 'date') {
              firstValue = new Date(a[field.sortByKey]);
              secondValue = new Date(b[field.sortByKey]);
            }
            return firstValue > secondValue ? direction : firstValue < secondValue ? -(direction) : 0;

          })
          .reduce((pos, neg) => pos ? pos : neg, 0);
      }
    }
}

使用することです:

const sortOptions = [{
      sortByKey: 'anyKey',
      sortType: 'string',
      sortingOrder: 'asc',
    }];

arrayOfObjects.sort(CustomSorting.sortArrayOfObjects(sortOptions));

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