ES6检查深层嵌套动态对象中的属性值

时间:2018-12-07 22:20:26

标签: javascript object ecmascript-6

我的数据集:

import matplotlib.pyplot as plt
import scipy.optimize as so

def function(C, m):
    result = []
    for i,j in zip(Re, Pr):
        y = C * i ** m * j ** (1/3)
        result.append(y)
    return result

parameters, covariance = so.curve_fit(function, Re, Nu)
y2 = function(Re, Pr, *parameters)
print(parameters)

plt.plot(Re, Nu)
plt.plot(Re, y2)
plt.show()

问题:

我有一些包含学生对象的课程对象。每门课程可能包含不同数量的学生。

我需要搜索每门课程和每位学生,以查看分配的属性是否设置为true。

理想情况下,我想调用一个执行此搜索并仅返回true或false的函数。搜索时,一旦发现分配的属性设置为true,搜索就会退出并返回true。如果每个课程的每个学生的所有分配属性都设置为false,则返回false。

我希望这个问题有意义,我希望数据集有意义/正确格式化(我正在处理所有对象-没有数组)。所有课程对象都在一个对象中。

在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您将很难按照所写的那样搜索该数据。真正的问题是您对数据结构的选择。在两个地方,当您应该使用数组时,您正在使用一个对象。

这里是相同的数据,但是将courses编码为数组,可以使用rich set of array methods遍历。我对每门课程的学生人数进行了相同的更改。

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

希望您能看到这种结构上的变化如何为您打开新的大门。

祝你好运。

答案 1 :(得分:1)

您在这里!

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

参考:someObject.keys

答案 2 :(得分:1)

这应该可以解决问题,请记住,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);