Как мне перейти к массиву, вложенному в объект?

#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);