Не удается отсортировать данные из массива. сортировка — это не функция

#javascript #react-native

#javascript #react-native

Вопрос:

Я пытаюсь отсортировать данные из массива, от младшего до самого большого. и я получаю сообщение об ошибке: time.sort не является функцией, time.sort является undefined .

Вот мой код:

 {
    this.state.measure.map((data, index) => {
        let time = data.duration
        const totalTime = time.sort((a, b) => parseFloat(a.time) - parseFloat(b.time))
        console.log(totalTime)
    })
}
                        
 

Если я console.log (время) Я получаю 15:00, 12:00, 50:00, 15:10 это данные, которые я хочу отсортировать, но сначала мне нужно преобразовать в числа с помощью parseFloat(), а затем использовать для упорядочивания, в любом случае, это не проблема.
Похоже, что sort() проблема в моем коде.
Это мой JSON.

 {
  "measures": [
    {
      "_id": "5fb56d5e734b7e04b9c97c9d",
      "creationDate": "18/11/2020",
      "startTime": "10:00",
      "duration": "15:00",
      "voltage": "220V",
      "avgPower": "34W",
      "maxPower": "7200W",
      "WaterConsumption": "30",
      "avgTemperature": "42",
      "maxTemperature": "48",
      "shower": "5fb56ce7734b7e04b9c97c9b",
      "__v": 0,
      "id": "5fb56d5e734b7e04b9c97c9d"
    },
  ]
}
 

У меня есть три объекта, подобных этому, и я просто хочу упорядочить их от меньшего к самому большому.

Я попытался изменить код на

 {this.state.measure.map((data, index)=> {
    let time = parseFloat(data.duration)
    console.log(time)
})}
 

Теперь я получаю 15, 12, 50, 17.1

Комментарии:

1. Длительность — это строка, а не массив, поэтому вы не можете ее отсортировать.

2. Да, но я использовал parseFloat() для преобразования в числа.

3. Это не имеет значения. Вы не можете отсортировать строку. Что вы пытаетесь сделать?

4. Я предполагаю, что OP хочет отсортировать меру по длительности? В каком случае это необходимо this.state.measures.sort() …. ?

5. @RafaeldeFreitas Да. Посмотрите мое обновление в вопросе. я просто хочу упорядочить числа.

Ответ №1:

Вместо этого вы должны отсортировать measures массив.

 this.state.measure.sort((a,b)=>{
   const [m, s] = a.time.split(":").map(Number), [m2, s2] = b.time.split(":").map(Number);
   return m * 60   s - (m2 * 60   s2);
});
 

Ответ №2:

Если я не ошибаюсь, то вы хотите что-то вроде этого-

 const data = {
  "measures": [
    {
      "_id": "5fbaaa",
      "duration": "15:00",
    },
    {
      "_id": "5fbbdd",
      "duration": "12:20",
    },
    {
      "_id": "5fbbbb",
      "duration": "12:00",
    },
    {
      "_id": "5fbccc",
      "duration": "25:30",
    },
  ]
};

const inMin = (duration) => {
  const [hour, min] = duration.split(':');
  return hour * 60   min * 1;
}

data.measures.sort((a, b) => {
  return inMin(b.duration) - inMin(a.duration);
});

console.log(data); 

Здесь я сократил вашу структуру данных и принял вашу продолжительность в HH:mm формате и преобразовал продолжительность в минуты и сортировку по desc порядку.

Ответ №3:

поскольку формат времени находится в строке и имеет: перед использованием parseFloat просто выполните time.split(‘:’).join(‘.’)

 this.state.measure.map((data, index) => {
        let time = data.duration
        const totalTime = time.sort((a, b) => parseFloat(a.time.split(':').join('.') )- parseFloat(b.time.split(':').join('.')))
        console.log(totalTime)
})
 

Ответ №4:

Хорошо, похоже, вы хотите отсортировать массив. Для этого вы должны использовать Array.sort метод вместо Array.map .

Следующий фрагмент кода отсортирует массив, сравнивая duration значения. Строка.localeCompare — удобная функция для этого, поскольку она уже преобразует дату для вас.

 this.state.measures.sort((a,b) => a.duration.localeCompare(b.duration))
 

Комментарии:

1. Это уже близко. Но когда я меняю «map» на sort, говорит: «Undefined не является объектом (оценка ‘this.state.measures.sort’), я пытался отлаживать по частям, и когда я переключаюсь с map на sort, автоматически происходит сбой. Я попытался создать пустой массив и поместить туда значения, но он создает новый массив для каждого из чисел.