У меня есть структура данных что-то вроде этого.
[
{"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"},
]
Я пытаюсь отсортировать его по свойству name
.
Мне нужно, чтобы все записи с name=max
были первыми, за ними name=Sam
, а затем name=John
и остальные записи, которые имеют пустое поле имени или любое другое значение.
Пробовал разные техники, но желаемого результата не получил.
Может ли кто-нибудь предложить мне, как я могу достичь этого?
Спасибо.
Вы можете сделать следующее,
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.info(data);
Спасибо, sabbir.alam за ответ. Я даже пробовал это решение, но результат, который я ожидаю, есть. Макс, Сэм, Джон. и т. д. Выше код дает Сэма, Макса, Джона и т. д.
Вы можете дать оценку каждому name
случаю, а затем использовать оценку в функции Array.sort
.
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.info(data);
Привет, вы можете использовать этот код
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.info(output);
Что делать, если ваши данные содержат имя с учетом регистра?
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.info(data);
вы можете использовать Array.prototype.sort() с пользовательской функцией сравнения. взгляните developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…