#javascript #arrays #nested #javascript-objects
Вопрос:
Я работаю над этим уже несколько часов и не могу этого понять. У меня есть объект контрольного списка, отсортированного по категориям, и каждая категория представляет собой массив объектов задач. Я пытаюсь разрешить пользователю добавлять задачу в заданный массив категорий, но не могу ее вычислить. Каждый раз, когда я пытаюсь войти в массив, он просто выводит наблюдателя и говорит, что». push » не является функцией.
Я думаю, что проблема связана с использованием переменной для получения массива, потому что, когда я напишу жесткий код в ‘masterChecklist[«Общая очистка»]», это будет работать. Пожалуйста, помогите!
** Приведенный ниже пример упрощен
var masterChecklist = {
"General Cleaning":
[
{cleaned: false, notes: "", name: 'Empty and sanitize trash bins'},
{cleaned: false, notes: "", name: 'Clean mirrors and windows'},
],
"Home Exterior":
[
{cleaned: false, notes: "", name: 'Wipe and clean all furniture'},
{cleaned: false, notes: "", name: 'Empty the trash bins'},
],
}
SaveTaskDetails("Dust", "Make sure to get the shelves", "General Cleaning")
function SaveTaskDetails(name, notes, category) {
var newTask = {
name: name,
notes: notes,
cleaned: false
}
var category = masterChecklist[category].push(newTask)
}
console.log(masterChecklist);
Комментарии:
1. Я преобразовал ваш код в исполняемый фрагмент, и он работает без ошибок.
2. Это будет работать только в том случае, если вы сохраняете в существующей категории. Если вам нужно иметь возможность создавать новые категории, функция должна проверить
masterChecklist[category]
, существует ли она уже, и при необходимости добавить ее.
Ответ №1:
Вы можете сделать:
const masterChecklist = {'General Cleaning': [{ cleaned: false, notes: '', name: 'Empty and sanitize trash bins' },{ cleaned: false, notes: '', name: 'Clean mirrors and windows' },],'Home Exterior': [{ cleaned: false, notes: '', name: 'Wipe and clean all furniture' },{ cleaned: false, notes: '', name: 'Empty the trash bins' }]}
const SaveTaskDetails = (name, notes, category) => {
if (!masterChecklist[category]) {
masterChecklist[category] = []
}
masterChecklist[category].push({ name, notes, cleaned: false })
}
SaveTaskDetails('Dust', 'Make sure to get the shelves', 'General Cleaning')
SaveTaskDetails('Dust', 'Make sure to get the shelves', 'New Category')
console.log(masterChecklist)
Ответ №2:
Вы должны проверить, существует ли категория, если нет, вы должны назначить пустой массив и добавить в него.(В своем коде я предположил, что категория не существует, потому что она выдает ошибку, когда категория не существует.)(Кстати, я настоятельно рекомендую вам использовать const и let вместо var)
Ответ №3:
Вы Не Должны Использовать Пробелы В Ключе Объекта, _
вместо этого используйте
вы можете проверить свою переменную перед выполнением какой-либо операции с typeof
оператором
пример
var masterChecklist = {
"General Cleaning":
[
{cleaned: false, notes: "", name: 'Empty and sanitize trash bins'},
{cleaned: false, notes: "", name: 'Clean mirrors and windows'},
],
"Home Exterior":
[
{cleaned: false, notes: "", name: 'Wipe and clean all furniture'},
{cleaned: false, notes: "", name: 'Empty the trash bins'},
],
}
SaveTaskDetails("Dust", "Make sure to get the shelves", "General Cleaning")
SaveTaskDetails("Dust", "Make sure to get the shelves", "New Category")
function SaveTaskDetails(name, notes, category) {
var newTask = {
name: name,
notes: notes,
cleaned: false
}
var selectedCatg = typeof masterChecklist[category] == "undefined"?masterChecklist[category] = []:masterChecklist[category]
selectedCatg.push(newTask)
}
console.log(masterChecklist);