Bepaling jongste en oudste datum in Javascript / Jquery

Status
Niet open voor verdere reacties.

Donamd

Gebruiker
Lid geworden
16 feb 2010
Berichten
25
Hoe kan ik via Javascript of Jquery uit onderstaande array de oudste datum van created_at bepalen en eveneens de jonste datum ?

Code:
var data = {
  "total":2,
  "data":[
    { "id":1,
      "title":"mytitle1",
      "content":"myconten1",
      "created_at":"2017-04-08"
    },{ "id":2,
        "title":"mytitle2",
        "content":"mycontent2",
        "created_at":"2017-07-10"
    },{ "id":3,
        "title":"mytitle3",
        "content":"mycontent3",
        "created_at":"2017-01-01"
    }]};
 
Eerst alle datums uit var data in een array zetten, dat werkt makkelijker.
Dan elke datum in dit array omzetten in een Date(). Een Date() is eigenlijk een getal (aantal milliseconden sinds 1 januari 1970) en getallen kunnen worden gesorteerd, daarvoor wordt sort() gebruikt. Daarna kan je elke datum in het array in het formaat zetten zoals je dat wilt.

De jongste datum is (na het sorteren) de eerste cel in het array, en de oudste datum is de laatste cel.
Je zou nu ook in een "for loop" de datums in volgorde kunnen tonen want het array is gesorteerd :p

De waarde "total": 2 in jouw voorbeeld klopt trouwens niet :confused:

Code:
var data = {
    "total":2,
    "data":[
        {
            "id":1,
            "title":"mytitle1",
            "content":"myconten1",
            "created_at":"2017-04-08"
        },{
            "id":2,
            "title":"mytitle2",
            "content":"mycontent2",
            "created_at":"2017-07-10"
        },{
            "id":3,
            "title":"mytitle3",
            "content":"mycontent3",
            "created_at":"2017-01-01"
        }
    ]
};

// lege array waarin straks alle created_at datums gaan komen
var createdArr = [];

// voor elk item in object "data" => array "data"
data.data.forEach(function(obj) {
    // converteer "2017-07-10" in een Date() en voeg dit toe aan createdArr
    createdArr.push( new Date(obj.created_at) );
});

// array 'createdArr' numeriek sorteren (elke cel heeft een Date() getal)
createdArr.sort((a,b) => a-b);

// zet elk Date() in 'createdArr' om in een Nederlands datum "dd-mm-yyyy"
for (var i = 0; i < createdArr.length; i++) {
    createdArr[i] = createdArr[i].toLocaleDateString("nl-NL", {
        year: "numeric", month: "2-digit", day: "2-digit"
    });
}

// aantal items (in voorbeeld: 3)
console.log ( createdArr.length );

// jongste datum (in voorbeeld: 10-07-2017)
console.log ( createdArr[0] );

// oudste datum (in voorbeeld: 01-01-2017)
console.log ( createdArr[createdArr.length - 1] );

Aanvulling: als het heel veel data is dan heeft dit een betere performance. Het komt in plaats van de for { ... }
Code:
var dateTimeFormat = new Intl.DateTimeFormat("nl-NL", {
    year: "numeric", month: "2-digit", day: "2-digit"
});
createdArr = createdArr.map(dateTimeFormat.format);


Edit: zie volgend bericht.
 
Laatst bewerkt:
Aanpassing hierboven: De sort() heb ik onder de foreach loop gezet want performance is niet goed als telkens in de foreach loop wordt gesorteerd. Een array numeriek sorteren heb ik verandert, info op deze site
 
Laatst bewerkt:
Een manier om gehele var data te sorteren op "created_at" + de datum als "dd-mm-jjjj" erin te zetten.

Code:
var data = {
    ....
};

// sorteer objecten in data.data op "created_at
data.data.sort(function(a,b) {
    return a.created_at.localeCompare(b.created_at);
});

// alle created_at omzetten in Date() en daarna in "dd-mm-jjjj"
data.data.map(function (item) {
    item.created_at = new Date(item.created_at).toLocaleString("nl-NL", {
        year: "numeric", month: "2-digit", day: "2-digit"
    });
});

// voorbeeld hoe alle gesorteerde objecten te tonen
data.data.forEach(function(item) {
    alert (item.created_at + "\r\n" + item.title + ": " + item.content);
});

console.log ( data.data.length );  // aantal items
console.log ( data.data[0].created_at );  // oudste datum
console.log ( data.data[data.data.length - 1].created_at );  // jongste datum


Als het alleen maar om de jongste en oudste datum gaat dan voldoet dit
Code:
var data = {
    ....
};

var oudste  = new Date("1970-01-01");
var jongste = new Date("9999-12-31");
var datum   = new Date();

for (var i = 0; i < data.data.length; i++) {
    datum = new Date(data.data[i].created_at);
    if (datum < jongste) jongste = datum;
    if (datum > oudste)  oudste  = datum;
}

jongste = jongste.toLocaleString("nl-NL", { year: "numeric", month: "2-digit", day: "2-digit" });
oudste  = oudste.toLocaleString("nl-NL", { year: "numeric", month: "2-digit", day: "2-digit" });
alert ("Van " + jongste + " t/m " + oudste);
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan