ES6 Проверить значение свойства в глубоко вложенном динамическом объекте - PullRequest
0 голосов
/ 08 декабря 2018

Мой набор данных:

{
    courseID003: {
        studentID34: {
            assigned: false
            dueDate: null
        }
        studentID34: {
            assigned: false
            dueDate: null
        }
    }
    courseID007: {
        studentID89: {
            assigned: true
            dueDate: "2018-12-07 15:51"
        }
        studentID111: {
            assigned: true
            dueDate: "2018-12-07 15:51"
        }
        studentID115: {
            assigned: false
            dueDate: null
        }
    }
}

Вопрос:

У меня есть несколько объектов курса, которые содержат объекты студента.Каждый курс может содержать разное количество студентов.

Мне нужно выполнить поиск по каждому курсу и каждому студенту, чтобы определить, установлено ли для присвоенного свойства значение true.

В идеале я хотел бы позвонитьфункция, которая выполняет этот поиск и просто возвращает истину или ложь.При поиске, как только найденное назначенное свойство будет установлено в true, поиск завершится и вернет true.Если всем назначенным свойствам присвоено значение false для каждого студента в каждом курсе, верните false.

Я надеюсь, что этот вопрос имеет смысл, и я надеюсь, что набор данных имеет смысл / правильно отформатирован (я имею дело со всеми объектами -- нет массивов).Все объекты курса находятся в объекте.

Заранее благодарим за любую помощь!

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Вот, пожалуйста!

const data = {
    courseID003: {
        studentID34: {
            assigned: false,
            dueDate: null
        },
        studentID34: {
            assigned: false,
            dueDate: null
        }
    },
    courseID007: {
        studentID89: {
            assigned: true,
            dueDate: "2018-12-07 15:51"
        },
        studentID111: {
            assigned: true,
            dueDate: "2018-12-07 15:51"
        },
        studentID115: {
            assigned: false,
            dueDate: null
        }
    }
}

const search = (data) => {
  return Object.keys(data).some(courseKey => {
    return Object.keys(data[courseKey]).some(studentKey => {
      return data[courseKey][studentKey]['assigned']
    })
  })
}

console.log(search(data))

Ссылка: некоторые , Object.keys

0 голосов
/ 08 декабря 2018

Это должно сработать, имейте в виду, что для Object.values ​​может потребоваться polyfill (для IE), а также flatMap (отсутствует во многих браузерах atm).

const courses = Object.values(data);
const students = courses.flatMap(course => Object.values(course);
const result = students.some(student => student.assigned);
0 голосов
/ 08 декабря 2018

У вас будут проблемы с поиском этих данных в том виде, как они написаны.Реальная проблема заключается в выборе структуры данных.В двух местах вы используете объект, когда вы должны использовать массив.

Здесь те же данные, но с courses, закодированным как массив, который можно просмотреть с помощью набора rich arrayметоды .Я внес одно и то же изменение в коллекцию студентов для каждого курса.

let courses = [
    {
        id: 'courseID003',
        students: [
            {
                id: 'studentID34',
                assigned: false,
                dueDate: null
            },
            {
                id: 'studentID34',
                assigned: false,
                dueDate: null
            }
        ]
    },
    {
        id: 'courseID007',
        students: [
            {
                id: 'studentID89',
                assigned: true,
                dueDate: "2018-12-07 15:51"
            },
            {
                id: 'studentID111',
                assigned: true,
                dueDate: "2018-12-07 15:51"
            },
            {
                id: 'studentID115',
                assigned: false,
                dueDate: null
            }
        ]
    }
];

let unassignedStudents = Array.prototype.concat.apply(
  [],
  courses.map(c => c.students.filter(s => !s.assigned)));

console.log('unassignedStudents:',unassignedStudents);

С этой улучшенной структурой данных вы можете найти всех «неназначенных» учеников, таких как:

let unassignedStudents = Array.prototype.concat.apply(
  [],
  courses.map(c => c.students.filter(s => !s.assigned)));

Надеюсь, вы увидите, как это изменение в структуреоткрывает новые двери для вас.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...