Как я могу приблизиться и выровнять элементы в массиве?

#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. большое вам спасибо 🙂