J'ai un fichier JSON contenant des informations et des données sur mon travail comme ceci :

{
"Employes":[
        {
            "id": 1,
            "fullName": "Test Test"
        }
    ],
"Infos":[
        {
            "id": 1,
            "address": "Test Test test test test",
            "employes": 1
        }
  ]
}

Je souhaite générer automatiquement les classes Employes et Infos sur le code JS et y ajouter une méthode.

FetchJSONFile c'est une fonction pour obtenir des données à partir d'un fichier JSON en utilisant AJAX :

function fetchJSONFile(callback) {
    var httpRequest = new XMLHttpRequest();
    httpRequest.onreadystatechange = function() {
        if (httpRequest.readyState === 4) {
            if (httpRequest.status === 200) {
                var data = JSON.parse(httpRequest.responseText);
                if (callback) callback(data);
            }
        }
    };
    httpRequest.open('GET', 'datas.json');
    httpRequest.send(); 
}

Donc, ici sur la fonction de génération, je veux générer des classes automatiquement et lui attribuer un objet, j'essaie en faisant ceci:

function generate(nameOfObject){
        fetchJSONFile(function(data){
            employes = Object.assign(new Employes(), ...data[nameOfObject]);
            console.log(employes);
        });
    }

Sur cette ligne, j'affecte un objet JSON à Mes classes Employes(), ma question est de savoir comment générer Employes() automatiquement attribuer du type JSON, donc si Infos par exemple, nouveau Employes() devient nouveau Infos() ... etc.

Je veux faire cela, ajouter des fonctions à ces classes, comme addNew(), deleteOne() .... etc, Tout sur CRUD.

Y-a-t'il une solution ?

2
sayou 14 mars 2019 à 10:38

2 réponses

Meilleure réponse

Vous pouvez créer une classe DynamicClass qui accepte une valeur d'entrée et type qui pourrait être Employes, Infos...

function DynamicClass (data, type) {
  this.type = type;
  // Init function
}
DynamicClass.prototype.xxxx = function () {}

Vous pouvez maintenant simplement utiliser votre objet de données pour créer les classes.

fetchJSONFile(function(data){
  for(var key in data) {
    var classObj  = new DynamicClass(data[key], key);
  }
});
2
varun agarwal 14 mars 2019 à 07:50

Si l'objet renvoyé n'a que 2 clés, vous pouvez map parcourir les entrées et créer 2 variables de tableau comme celle-ci :

Si vous avez plus de 2 propriétés, vous pouvez utiliser un switch à l'intérieur du map interne :

function Employee() { this.defaultEmployeeProp = "default" }
function Infos() { this.defaultInfosProp = "default" }

const data={"Employes":[{"id":1,"fullName":"Test Test"}],"Infos":[{"id":1,"address":"Test Test test test test","employes":1}]}

const [employees, infos] = Object.entries(data).map(([key, values]) =>
  values.map(e => Object.assign(key === "Employes" ? new Employee() : new Infos(), e))
)

console.log(employees)
console.log(infos)

Si vous voulez que tous les types d'objets aient le même prototype, alors il n'y a pas besoin d'un ternaire à l'intérieur du map. Créez une fonction constructeur générique ou un class, puis créez des instances du class. Si vous souhaitez un comportement spécifique pour chaque type d'objet, vous pouvez toujours extend la classe et utiliser le switch comme mentionné dans l'extrait précédent

function GenericConstructor() {
  this.default = "default"
}

GenericConstructor.prototype.commonMethod = function() {
  console.log("common method called")
}

const data={"Employes":[{"id":1,"fullName":"Test Test"}],"Infos":[{"id":1,"address":"Test Test test test test","employes":1}]}

const [employees, infos] = Object.entries(data).map(([key, values]) =>
  values.map(e => Object.assign(new GenericConstructor(), e))
)

console.log(employees)
console.log(infos)
2
adiga 14 mars 2019 à 08:09