#javascript #arrays #reactjs
#javascript #массивы #reactjs
Вопрос:
Эй, ребята, я здесь немного озадачен. Что я делаю не так, у меня есть и массив объектов во внешнем файле, который выглядит примерно так :
import moment from "moment";
export default [{
filterOn: "startDate",
startDate: moment("01/01/2013", "DD/MM/YYYY").startOf("day"),
endDate: moment().startOf("day")
}];
Затем я импортирую свой массив через props
like : props.datePickerDefinition
В отдельный файл я извлекаю массив и пытаюсь извлечь значение из массива в некоторые состояния через useState
и setState
const [fromToDatePickerColumn, setFromToDatePickerColumn] = useState();
const [dateFrom, setDateFrom] = useState();
const [dateTo, setDateTo] = useState();
Моя цель — использовать useEffect
функцию и обновить состояние этих трех элементов с помощью переключателя :
useEffect(() => {
props.datePickerDefinition.map((date) => {
switch (typeof date) {
case 'string':
setFromToDatePickerColumn(date.fromToDatePickerFilterOn)
break;
case'moment' :
setDateFrom(date.startDate)
setDateTO(date.endDate)
}
})
})
Итак, сначала у меня есть два вопроса. Могу ли я использовать switch
регистр для проверки объекта moment ? И второй и самый важный вопрос заключается в том, почему, когда я извлекаю значение из .map
функции, я получаю undefined
, но если я проверяю значение, props.datePickerDefinition.map((date) => console.log(date))
я вижу его. Может кто-нибудь помочь мне, я буду очень благодарен, чтобы понять, что я делаю не так.
Я пробовал с .forEach
помощью функции :
const array1 = [{first:'a', second:'b', third:'c'}];
const test = array1.forEach(element => element.first);
console.log(test)
А также .map :
const array1 = [{first:'a', second:'b', third:'c'}];
const test = array1.map(element => element.first);
console.log(test)
Но в этом случае она возвращает меня ["a"]
, и мне нужно только значение, а не Array
Комментарии:
1. Вам нужно что-то вернуть с карты? Как я вижу, вы ничего не возвращаете. Если я вижу функцию map и она ничего не возвращает, это меня смущает. forEach было бы лучше, если вы не хотите ничего возвращать
2. По сути
fromToDatePickerColumn
, должно быть установлено значение"startDate"
… из данных из массива и так далее и тому подобное, но в моем случае возвращает меняundefined
3. И вы проверили, что
typeof date
возвращает"moment"
? Он не возвращается"object"
?4. Ах, да, я должен проверить
object
, не включенmoment
, но тем не менее, если я попытаюсьconst test = props.datePickerDefinition.forEach((date) => date.filterOn)
, результат все равноundefined
будет …. я не понимаю5. Если вы знаете, что массив содержит только один элемент, вы могли бы просто
const test = array1.map(element => element.first)[0];
или даже лучшеarray1[0].first
Ответ №1:
Вам нужно снова выполнить итерацию по дате, чтобы установить состояния. Но map здесь не подойдет. Попробуйте следующий код:
useEffect(() => {
props.datePickerDefinition.forEach(date =>{
for(let key in date){
const dateItem = date[key];
switch (typeof dateItem) {
case 'string':
setFromToDatePickerColumn(date.filterOn);
break;
case 'object' :
setDateFrom(date.startDate);
setDateTo(date.endDate);
break;
default: break;
}
}
})
})
Комментарии:
1. Да, приятель, это сделало свое дело. Итак, я узнаю об этом после первой итерации, которую я также повторяю по дате. Спасибо за помощь . Ура !
Ответ №2:
Добавьте оператор return внутри переключателей в вашей карте