如何有效地过滤对象中的对象?

Doe*_*Doe 2 javascript json object filter object-properties

这个问题在SO中已经提出过很多次了,但是都是指对象数组。

就我而言,我想过滤对象的对象。

假设我有这个对象:

"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
  }
}
Run Code Online (Sandbox Code Playgroud)

我想过滤这个,这样我就可以得到以下内容:

"UsersCustom": {
  "w14FKo72BieZwbxwUouTpN7UQm02": {
    "name": "Naseebullah Ahmadi",
    "userType": "Patient",
    "writePermission": false
  },
  "SXMrXfBvexQUXfnVg5WWVwsKjpD2": {
    "name": "Levi Yeager",
    "userType": "Patient",
    "writePermission": false
  }
}
Run Code Online (Sandbox Code Playgroud)

这样做有什么意义呢?

请注意,这个对象“User”实际上非常庞大(超过 1000 个条目),并且每个用户拥有的属性不仅仅是“name”、“userType”和“writePermission”。

我需要过滤用户对象的原因是这样我可以获得只有(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);
      })
    }
  })
)
Run Code Online (Sandbox Code Playgroud)

我上面的解决方案虽然部分完成,但仍然不高效且错误。因为我需要每个患者的 ID 以便进行其他查找

更新

目前,大多数解决方案都提供对条目的循环,这意味着在最坏的情况下它将运行 O(n)。有没有可能比 O(n) 更快地解决它?

Far*_*sir 5

使用reduce方法你可以得到你的对象

var data = {
  "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
 }
Run Code Online (Sandbox Code Playgroud)

};

var results = Object.keys(data).reduce(function(acc, val) {
    if(data[val].userType === 'Patient')  acc[val] = data[val];
  return acc;
}, {});
console.log(results);
Run Code Online (Sandbox Code Playgroud)