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);

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

Comments

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 Comment

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.
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);

Comments

-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);

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.