1

I have data structure something like this.

[ {"name": "John", "gender": "Male", "id": "1"}, {"name": "Max", "gender": "Male", "id": "2"}, {"name": "John", "gender": "Male", "id": "3"}, {"name": "Sam", "gender": "Male", "id": "4"}, {"name": "Max", "gender": "Male", "id": "5"}, {"name": "Sam", "gender": "Male", "id": "6"}, {"name": "Sam", "gender": "Male", "id": "7"}, {"name": " ", "gender": "Male", "id": "8"}, {"name": "John", "gender": "Male", "id": "9"}, {"name": " ", "gender": "Male", "id": "10"}, ] 

I am trying to sort on it based on name property. I need all the records with name=max should come first followed by name=Sam and then name=John and the remaining records that have empty name field or any other value.

I tried different techniques but didn't get the desired results.

Can someone suggest to me how I can achieve this?

Thanks.

1

4 Answers 4

2

You can give scores to each name case, and then use the score in Array.sort function.

const data = [ { name: 'John', gender: 'Male', id: '1' }, { name: 'Max', gender: 'Male', id: '2' }, { name: 'John', gender: 'Male', id: '3' }, { name: 'Sam', gender: 'Male', id: '4' }, { name: 'Max', gender: 'Male', id: '5' }, { name: 'Sam', gender: 'Male', id: '6' }, { name: 'Sam', gender: 'Male', id: '7' }, { name: ' ', gender: 'Male', id: '8' }, { name: 'John', gender: 'Male', id: '9' }, { name: ' ', gender: 'Male', id: '10' } ]; const getScore = name => { if (name === 'Max') return 3; else if (name === 'Sam') return 2; else if (name === 'John') return 1; else return 0; }; data.sort((a, b) => getScore(b.name) - getScore(a.name)); console.log(data);

    2

    You can do the following,

    data = [ {"name": "John", "gender": "Male", "id": "1"}, {"name": "Max", "gender": "Male", "id": "2"}, {"name": "John", "gender": "Male", "id": "3"}, {"name": "Sam", "gender": "Male", "id": "4"}, {"name": "Max", "gender": "Male", "id": "5"}, {"name": "Sam", "gender": "Male", "id": "6"}, {"name": "Sam", "gender": "Male", "id": "7"}, {"name": " ", "gender": "Male", "id": "8"}, {"name": "John", "gender": "Male", "id": "9"}, {"name": " ", "gender": "Male", "id": "10"}, ] data.sort((a, b) => { if(a.name < b.name) { return 1; } else if(a.name > b.name) { return -1; } return 0; }) console.log(data);

    1
    • Thanks, sabbir.alam for the answer. I even tried this solution but output that I am expecting is. Max, Sam, John. etc. Above code gives Sam, Max, John, etc.
      – brig
      CommentedDec 24, 2020 at 7:31
    0

    What if your data contains case sensitive name ?

    const getScore = name => { if (name.toLowerCase() === 'max') return 3; else if (name.toLowerCase() === 'sam') return 2; else if (name.toLowerCase() === 'john') return 1; else return 0; }; data.sort((a, b) => getScore(b.name) - getScore(a.name)); console.log(data); 
      -1

      Hi you can use this code

      var arr = [ {"name": "John", "gender": "Male", "id": "1"}, {"name": "Max", "gender": "Male", "id": "2"}, {"name": "John", "gender": "Male", "id": "3"}, {"name": "Sam", "gender": "Male", "id": "4"}, {"name": "Max", "gender": "Male", "id": "5"}, {"name": "Sam", "gender": "Male", "id": "6"}, {"name": "Sam", "gender": "Male", "id": "7"}, {"name": " ", "gender": "Male", "id": "8"}, {"name": "John", "gender": "Male", "id": "9"}, {"name": " ", "gender": "Male", "id": "10"}, ]; var arr1 = arr.filter((value, index) => { if(value.name == 'Max'){ return value } }); var arr2 = arr.filter((value, index) => { if(value.name != 'Max'){ return value } }); arr2 = arr2.sort((a, b) => (a.name < b.name) ? 1 : -1); var output = arr1.concat(arr2); console.log(output); 

        Start asking to get answers

        Find the answer to your question by asking.

        Ask question

        Explore related questions

        See similar questions with these tags.