Skip to content

How to get unique data from array of object by date range in javascript

Hello all I need help I am trying to get the latest data from an array of objects by from_date and to_date in JavaScript I am not able to fetch it below is my array

[
    {"id": 408,"customer_id": 2,"bill_no": 381,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 409,"customer_id": 3,"bill_no": 382,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 410,"customer_id": 4,"bill_no": 383,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 411,"customer_id": 6,"bill_no": 384,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 412,"customer_id": 7,"bill_no": 385,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 413,"customer_id": 8,"bill_no": 386,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 414,"customer_id": 9,"bill_no": 387,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 387,"customer_id": 2,"bill_no": 360,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 388,"customer_id": 3,"bill_no": 361,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 389,"customer_id": 4,"bill_no": 362,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 390,"customer_id": 6,"bill_no": 363,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 391,"customer_id": 7,"bill_no": 364,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 392,"customer_id": 8,"bill_no": 365,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 393,"customer_id": 9,"bill_no": 366,"bill_period": "weekly","from_date": "2021-10-03","to_date": "2021-10-09"},
    {"id": 380,"customer_id": 2,"bill_no": 353,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 381,"customer_id": 3,"bill_no": 354,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 382,"customer_id": 4,"bill_no": 355,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 383,"customer_id": 6,"bill_no": 356,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 384,"customer_id": 7,"bill_no": 357,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 385,"customer_id": 8,"bill_no": 358,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"},
    {"id": 386,"customer_id": 9,"bill_no": 359,"bill_period": "weekly","from_date": "2021-09-26","to_date": "2021-10-02"}
]

I am using this code to sort/filter:

const filtered = res.data.reduce((accumulator, current) => { 
    if (accumulator.find(x => x.customer_id === current.customer_id) { 
        return accumulator; } 
    accumulator.push(current); return accumulator; }, []); 
console.log(filtered);

I want the unique data from the above array by from and to latest date with I want the result like the below code

[
{"id": 408,"customer_id": 2,"bill_no": 381,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 409,"customer_id": 3,"bill_no": 382,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 410,"customer_id": 4,"bill_no": 383,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 411,"customer_id": 6,"bill_no": 384,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 412,"customer_id": 7,"bill_no": 385,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 413,"customer_id": 8,"bill_no": 386,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
    {"id": 414,"customer_id": 9,"bill_no": 387,"bill_period": "weekly","from_date": "2021-10-10","to_date": "2021-10-16"},
]

Answer

You could reduce the array and check if the date is greater than the other dates.

const
    data = [{ id: 408, customer_id: 2, bill_no: 381, bill_period: "weekly", from_date: "2021-10-10", to_date: "2021-10-16" }, { id: 409, customer_id: 3, bill_no: 382, bill_period: "weekly", from_date: "2021-10-10", to_date: "2021-10-16" }, { id: 410, customer_id: 4, bill_no: 383, bill_period: "weekly", from_date: "2021-10-10", to_date: "2021-10-16" }, { id: 411, customer_id: 6, bill_no: 384, bill_period: "weekly", from_date: "2021-10-10", to_date: "2021-10-16" }, { id: 412, customer_id: 7, bill_no: 385, bill_period: "weekly", from_date: "2021-10-10", to_date: "2021-10-16" }, { id: 413, customer_id: 8, bill_no: 386, bill_period: "weekly", from_date: "2021-10-10", to_date: "2021-10-16" }, { id: 414, customer_id: 9, bill_no: 387, bill_period: "weekly", from_date: "2021-10-10", to_date: "2021-10-16" }, { id: 387, customer_id: 2, bill_no: 360, bill_period: "weekly", from_date: "2021-10-03", to_date: "2021-10-09" }, { id: 388, customer_id: 3, bill_no: 361, bill_period: "weekly", from_date: "2021-10-03", to_date: "2021-10-09" }, { id: 389, customer_id: 4, bill_no: 362, bill_period: "weekly", from_date: "2021-10-03", to_date: "2021-10-09" }, { id: 390, customer_id: 6, bill_no: 363, bill_period: "weekly", from_date: "2021-10-03", to_date: "2021-10-09" }, { id: 391, customer_id: 7, bill_no: 364, bill_period: "weekly", from_date: "2021-10-03", to_date: "2021-10-09" }, { id: 392, customer_id: 8, bill_no: 365, bill_period: "weekly", from_date: "2021-10-03", to_date: "2021-10-09" }, { id: 393, customer_id: 9, bill_no: 366, bill_period: "weekly", from_date: "2021-10-03", to_date: "2021-10-09" }, { id: 380, customer_id: 2, bill_no: 353, bill_period: "weekly", from_date: "2021-09-26", to_date: "2021-10-02" }, { id: 381, customer_id: 3, bill_no: 354, bill_period: "weekly", from_date: "2021-09-26", to_date: "2021-10-02" }, { id: 382, customer_id: 4, bill_no: 355, bill_period: "weekly", from_date: "2021-09-26", to_date: "2021-10-02" }, { id: 383, customer_id: 6, bill_no: 356, bill_period: "weekly", from_date: "2021-09-26", to_date: "2021-10-02" }, { id: 384, customer_id: 7, bill_no: 357, bill_period: "weekly", from_date: "2021-09-26", to_date: "2021-10-02" }, { id: 385, customer_id: 8, bill_no: 358, bill_period: "weekly", from_date: "2021-09-26", to_date: "2021-10-02" }, { id: 386, customer_id: 9, bill_no: 359, bill_period: "weekly", from_date: "2021-09-26", to_date: "2021-10-02" }],
    result = data.reduce((r, o) => {
        if (!r || r[0].from_date < o.from_date) return [o];
        if (r[0].from_date === o.from_date) r.push(o);
        return r;
    }, undefined);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }