0

I have an array of objects like below.

var array = [{id: 1, date:'Mar 12 2012 10:00:00 AM', status:'done'}, 
                 {id: 2, date:'Mar 8 2012 08:00:00 AM', status:'done'},
                 {id: 3, date:'Mar 15 2012 10:00:00 AM', status:'done'}, 
                 {id: 4, date:'Mar 5 2012 08:00:00 AM', status:'done'},
                 {id: 5, date:'Mar 30 2012 10:00:00 AM', status:'done'}, 
                 {id: 6, date:'Mar 5 2012 08:00:00 AM', status:'done'},
                 {id: 7, date:'Mar 1 2012 10:00:00 AM', status:'done'}, 
                 {id: 8, date:'Mar 7 2012 08:00:00 AM', status:'notdone'},
                 {id: 9, date:'Mar 12 2012 10:00:00 AM', status:'notdone'}, 
                 {id: 10, date:'Mar 2 2012 10:00:00 AM', status:'notdone'}, 
                 {id: 11, date:'Mar 6 2012 10:00:00 AM', status:'notexist'}, 
                 {id: 12, date:'Mar 8 2012 08:00:00 AM', status:'notexist'}];

I am trying to sort first few elements in my array which has status:'done' and leave remaining records as it is.

Can someone help me with how I can put this condition and sort the elements.

Thanks.

1
  • 1
    What nobody is telling you in the answers below, is that the approach they're taking to create a Date object from a string, is fraught with risks. See MDN for more information. Commented Jan 29, 2021 at 4:09

4 Answers 4

1

var array = [{id: 1, date:'Mar 12 2012 10:00:00 AM', status:'done'}, 
                 {id: 2, date:'Mar 8 2012 08:00:00 AM', status:'done'},
                 {id: 3, date:'Mar 15 2012 10:00:00 AM', status:'done'}, 
                 {id: 4, date:'Mar 5 2012 08:00:00 AM', status:'done'},
                 {id: 5, date:'Mar 30 2012 10:00:00 AM', status:'done'}, 
                 {id: 6, date:'Mar 5 2012 08:00:00 AM', status:'done'},
                 {id: 7, date:'Mar 1 2012 10:00:00 AM', status:'done'}, 
                 {id: 8, date:'Mar 7 2012 08:00:00 AM', status:'notdone'},
                 {id: 9, date:'Mar 12 2012 10:00:00 AM', status:'notdone'}, 
                 {id: 10, date:'Mar 2 2012 10:00:00 AM', status:'notdone'}, 
                 {id: 11, date:'Mar 6 2012 10:00:00 AM', status:'notexist'}, 
                 {id: 12, date:'Mar 8 2012 08:00:00 AM', status:'notexist'}];
                 
var doneItems = array.filter(r => r.status === 'done');
var remainingItems = array.filter(r => r.status !== 'done');

doneItems.sort((a, b) => (new Date(a.date) - new Date(b.date)));

console.log(doneItems.concat(remainingItems));

Sign up to request clarification or add additional context in comments.

1 Comment

@brig Does this answer your question? Let me know if you need any help
1
const sorted = array.reduce((prev, curr, i, xs) => {
  // push into either the first or second sub-array based on status
  const idx = curr.status === 'done' ? 0 : 1
  prev[idx].push(curr)

  // if on the last element, sort the first array
  // the check is just to avoid running the sort on every iteration
  if (i === xs.length - 1) {
    prev[0].sort((a, b) => new Date(a.date) - new Date(b.date))
  }

  return prev

// initialize with a 2d array, flatten when it's all done
}, [[],[]]).flat()

Comments

1

All in one solution:

array.sort(function(a, b) {
    if (a.status === 'done' && b.status === 'done') {
        return new Date(a.date) - new Date(b.date);
    } else if (a.status === 'done') {
        return -1;
    } else if (b.status === 'done') {
        return 1;
    }
});

Comments

0

You can first filter by status, then sort by Date:

var array = [{id: 1, date:'Mar 12 2012 10:00:00 AM', status:'done'}, 
                 {id: 2, date:'Mar 8 2012 08:00:00 AM', status:'done'},
                 {id: 3, date:'Mar 15 2012 10:00:00 AM', status:'done'}, 
                 {id: 4, date:'Mar 5 2012 08:00:00 AM', status:'done'},
                 {id: 5, date:'Mar 30 2012 10:00:00 AM', status:'done'}, 
                 {id: 6, date:'Mar 5 2012 08:00:00 AM', status:'done'},
                 {id: 7, date:'Mar 1 2012 10:00:00 AM', status:'done'}, 
                 {id: 8, date:'Mar 7 2012 08:00:00 AM', status:'notdone'},
                 {id: 9, date:'Mar 12 2012 10:00:00 AM', status:'notdone'}, 
                 {id: 10, date:'Mar 2 2012 10:00:00 AM', status:'notdone'}, 
                 {id: 11, date:'Mar 6 2012 10:00:00 AM', status:'notexist'}, 
                 {id: 12, date:'Mar 8 2012 08:00:00 AM', status:'notexist'}];
 
let filtered = array.filter(x => x.status == 'done') ;
let sorted = filtered.sort((a, b) => new Date(a.date) - new Date(b.date));
console.log(sorted)

// concat the 'non done' status items:
let rest = array.filter(x => x.status != 'done');
console.log(sorted.concat(rest))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.