这个问题在 SO 中已经提出过很多次了,但都是指一个对象数组。
就我而言,我想过滤一个对象 objects。
假设我有这个对象:
"Users": {
"w14FKo72BieZwbxwUouTpN7UQm02": {
"name": "Naseebullah Ahmadi",
"userType": "Patient",
"writePermission": false
},
"SXMrXfBvexQUXfnVg5WWVwsKjpD2": {
"name": "Levi Yeager",
"userType": "Patient",
"writePermission": false
},
"VoxHFgUEIwRFWg7JTKNXSSoFoMV2": {
"name": "Ernest Kamavuako",
"userType": "Doctor",
"writePermission": true
},
"hFoWuyxv6Vbt8sEKA87T0720tXV2": {
"name": "Karla Stanlee",
"userType": "Doctor",
"writePermission": true
}
}
我想对此进行过滤,以便获得以下信息:
"UsersCustom": {
"w14FKo72BieZwbxwUouTpN7UQm02": {
"name": "Naseebullah Ahmadi",
"userType": "Patient",
"writePermission": false
},
"SXMrXfBvexQUXfnVg5WWVwsKjpD2": {
"name": "Levi Yeager",
"userType": "Patient",
"writePermission": false
}
}
这样做有什么意义?
请注意,这个对象“用户”实际上是巨大的(超过 1000 个条目),每个用户的属性不仅仅是“名称”、“用户类型”和“写入权限”。
我需要过滤用户对象的原因是我可以获取只有(Patient)的用户并获取该 Patient 的 id 以在另一个对象中查找,最后将它们全部合并到一个对象中。
到目前为止我所拥有的
// user is the object as seen above
let Patients = users ? (
// I loop through them
Object.keys(users).map((uid, i) => {
// get individual patient
const patient = users[uid];
// check their userType
if (patient.userType === "Patient") {
let customPatient = {
uid: uid,
name: patient.name,
profession: patient.profession,
history: null,
ecg: null,
heartSound: null
};
this._healthRef(uid).then(health => {
customPatient.history = health;
return this._heartSoundRef(uid).then(HS => HS);
}).then(HS => {
customPatient.heartSound = HS;
return this._ecgRef(uid).then(a => a);
}).then(ecg => {
customPatient.ecg = ecg;
}).then(() => {
cusomPatients.push(customPatient);
})
}
})
)
我上面的解决方案虽然部分完成,但仍然没有效率和错误。因为我需要每个患者的 ID 进行其他查找
更新
目前,大多数解决方案都提供遍历条目,这意味着在最坏的情况下它将运行 O(n)。有没有可能比 O(n) 更快地解决它?