#javascript #arrays
#javascript #массивы
Вопрос:
Я уже пробовал:
let age = arr.sort(function(a, b) {
return b -a;
});
это было хорошо для простого массива, но не работает. В этом массиве:
let list = [
[
['firstName', 'Joe'],
['age', 42],
['gender', 'male'],
],
[
['firstName', 'Mary'],
['lastName', 'Jenkins'],
['age', 36],
['gender', 'female'],
],
[
['lastName', 'Kim'],
['age', 40],
['gender', 'female'],
],
];
это двойной массив, и местоположение индекса ‘age’ отличается. Как я могу приблизиться к «возрасту» и выровнять? Я хочу отсортировать по возрастанию.
Ответ №1:
Вы можете использовать fromEntries
для преобразования элемента вашего массива в объект, а затем сортировать. Но вам следует подумать об обновлении элемента до object, чтобы избежать этого ненужного преобразования.
const list = [ [ ['firstName', 'Joe'], ['age', 42], ['gender', 'male'], ], [ ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['gender', 'female'], ], [ ['lastName', 'Kim'], ['age', 40], ['gender', 'female'], ], ];
list.sort((a, b) => Object.fromEntries(a).age - Object.fromEntries(b).age);
console.log(list);
Ответ №2:
Вы можете сделать следующее, найдя индекс дочернего массива, где мы можем найти возраст. Из примера мы можем видеть, что возраст находится в индексе 0, а значение возраста находится в индексе 1 подмассива. Вы можете сравнить значения возраста.
list = [
[
['firstName', 'Joe'],
['age', 42],
['gender', 'male'],
],
[
['firstName', 'Mary'],
['lastName', 'Jenkins'],
['age', 36],
['gender', 'female'],
],
[
['lastName', 'Kim'],
['age', 40],
['gender', 'female'],
],
];
res = list.sort((a, b) => {
ageIndexA = a.findIndex(item => item[0] ==='age');
ageIndexB = b.findIndex(item => item[0] === 'age');
return a[ageIndexA][1] - b[ageIndexB][1];
});
console.log(res);
Комментарии:
1. Ооо, еще раз большое вам спасибо :). я помню ваш последний код. я понял, что могу управлять без строки. длина.. в любом случае .. ваш код базовый.. и на самом деле я не понимаю оператора стрелки. но.. я попытаюсь понять утверждение. потому что это выглядит так просто 🙂 еще раз спасибо, благодаря вашей поддержке.
2.
list.sort((a, b) => a.find(item=> item[0] === 'age')[1] - b.find(item => item[0] === 'age')[1]);
это просто немного быстрее и проще. Но все же это более чем в 13 раз быстрее, чем подход Object.fromEntries Хассана Имама. Мне это нравится.
Ответ №3:
Должно работать следующее:
let list = [
[
['firstName', 'Joe'],
['age', 42],
['gender', 'male'],
],
[
['firstName', 'Mary'],
['lastName', 'Jenkins'],
['age', 36],
['gender', 'female'],
],
[
['lastName', 'Kim'],
['age', 40],
['gender', 'female'],
],
];
const compareFunction = (a,b) => {
return a.age - b.age;
}
const sortList = (arr) => {
const objectList = arr.map(e => Object.fromEntries(e));
return objectList.sort(compareFunction);
}
console.log('sorted:', sortList(list));
Ответ №4:
Следующее отсортирует ваш массив по возрастанию возраста:
let list = [
[
['firstName', 'Joe'],
['age', 42],
['gender', 'male'],
],
[
['firstName', 'Mary'],
['lastName', 'Jenkins'],
['age', 36],
['gender', 'female'],
],
[
['lastName', 'Kim'],
['age', 40],
['gender', 'female'],
],
];
let age = list.sort(function(a, b) {
return a.filter(aa=>aa[0]=="age")[0][1]
-b.filter(bb=>bb[0]=="age")[0][1];})
console.log(age)
// this is a better approach:
let listo=list.map(e=>e.reduce((a,[k,v])=>(a[k]=v,a), {}));
console.log(listo.sort((a,b)=>a.age-b.age))
Однако было бы лучше хранить ваши данные в другом формате :. Моя вторая часть генерирует такой формат в listo
. Затем функция сортировки снова становится тривиальной ( (a,b)=>a.age-b.age
):
[
{
"firstName": "Mary",
"lastName": "Jenkins",
"age": 36,
"gender": "female"
},
{
"lastName": "Kim",
"age": 40,
"gender": "female"
},
{
"firstName": "Joe",
"age": 42,
"gender": "male"
}
]
``´
Комментарии:
1. они хотели отсортировать в порядке возрастания
2. Хорошо, я изменил порядок сортировки на возрастающий (в обоих моих подходах).
3. благодаря вашей поддержке. я не думал использовать метод сокращения. и вы дали мне хорошее направление, когда я использовал метод filter. большое вам спасибо 🙂