#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, автоматически происходит сбой. Я попытался создать пустой массив и поместить туда значения, но он создает новый массив для каждого из чисел.