Éliminez les erreurs TypeScript lors de l'aplatissement des objets imbriqués
P粉388945432
P粉388945432 2024-01-10 18:05:39
0
1
623

Je crée un formulaire de modification pour mon entreprise et un membre de mon équipe a décidé de modifier le format de retour de notre charge utile API sans consulter les autres membres de l'équipe et maintenant nous essayons de rattraper notre retard.

Étant donné que l'appel API dont nous avons besoin pour renvoyer la valeur à la base de données n'est pas configuré en tant qu'objet imbriqué, je dois l'aplatir pour faciliter la manipulation de la valeur et sa soumission.

Voici la nouvelle structure imbriquée :

{
       "status": 1, 
       "data" : {
            "name": "Tank",
            "dimensions": "2.0 x 2.5 x 4.0"
       }
    }

Je dois le reconvertir en une structure comme celle-ci :

{
       "status": 1, 
       "name": "Tank",
       "dimensions": "2.0 x 22.5 x 4.0"
    }

J'ai trouvé plusieurs solutions en ligne, mais elles m'ont toutes donné la même erreur TypeScript :

"Les instructions for (... in ...) doivent être filtrées à l'aide des instructions if"

J'ai également constaté que de nombreuses solutions intègrent le nom du premier élément devant les éléments imbriqués, comme ceci :

{
       "status": 1, 
       "data.name": "Tank",
       "data.dimensions": "2.0 x 22.5 x 4.0"
    }

Quelqu'un peut-il me montrer comment réécrire cette fonction d'aplatissement pour éliminer l'erreur TS et ne pas ajouter le nom de l'élément de premier niveau à ses éléments imbriqués afin d'obtenir un objet simple à un seul niveau ?

Voici ma fonction d'aplatissement :

const obj = values;

const flattenObj = (ob) => {
  // 包含最终结果的对象
  const result = {};
  // 遍历对象“ob”
  for (const i in ob) {
      // 使用typeof()函数检查i的类型,并递归调用函数
      if ((typeof ob[i]) === 'object' && !Array.isArray(ob[i])) {
          const temp = flattenObj(ob[i]);
          for (const j in temp) {
              // 将temp存储在result中
              result[i + '.' + j] = temp[j];
          }
      }
      // 否则直接将ob[i]存储在result中
      else {
          result[i] = ob[i];
      }
  }
  return result;
};

console.log(flattenObj(ob));

P粉388945432
P粉388945432

répondre à tous(1)
P粉976737101

Vous pouvez

for (const i in ob) { .. }

changé en

for (const [i, obi] of Object.entries(ob)) { // use obi instead of ob[i] }

De cette façon, vous ne toucherez pas du tout au contenu du prototype.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal