J'ai écrit une solution différente, en utilisant la récursivité. J'utilisais ceci à namespace l'attribut de nom des éléments d'entrée. Prenez, par exemple, ce qui suit:
<input type="number" name="testGroup.person.age" />
Et disons que nous définissons la valeur de cette entrée à "25". Nous avons aussi un objet dans notre code quelque part:
var data = {
testGroup: {
person: {
name: null,
age: null,
salary: null
}
}
};
L'objectif est donc de mettre automatiquement la valeur ici dans notre élément d'entrée dans la bonne position dans cette structure de données.
J'ai écrit cette petite fonction pour créer un objet imbriqué basé sur tout tableau de namespaces vous passez à elle:
var buildObject = function (obj, namespaceArray, pos) {
var output = {};
output[namespaceArray[pos]] = obj;
if (pos > 0) {
output = buildObject(output, namespaceArray, pos-1);
}
return output;
};
Comment ça marche? Il commence à la fin du tableau namespaceArray
et crée un objet avec une propriété, dont le nom est celui qui se trouve dans le dernier emplacement namespaceArray
et dont la valeur est obj
.Il récursive ensuite, en enveloppant cet objet dans des objets supplémentaires jusqu'à ce qu'il manque de noms dans namespaceArray
. pos
correspond à la longueur du tableau namespaceArray
. Vous pourriez juste le faire dans le premier appel de fonction, quelque chose comme if (typeof(pos) === "undefined") pos = namespaceArray.length - 1
, mais alors vous auriez une instruction supplémentaire à évaluer chaque fois que la fonction est récurée.
D'abord, nous avons divisé l'attribut name
du input
dans un tableau autour des séparateurs d'espace de noms et d'obtenir la valeur de l'entrée:
var namespaceArray = inputElement.name.split("."),
obj = inputElement.value;
// Usually you'll want to do some undefined checks and whatnot as well
Ensuite, il suffit d'appeler notre fonction et affecter le résultat à une variable:
var myObj = buildObject(obj, namespaceArray, namespaceArray.length - 1);
myObj va maintenant ressembler à ceci:
{
testGroup: {
person: {
age: 25
}
}
}
À ce stade, j'utilise la fonction étendre jQuery pour fusionner cette structure de nouveau dans l'objet de données d'origine:
data = $.extend(true, data, myObj);
Cependant, la fusion de deux objets est pas très difficile à faire en JavaScript sans cadre et il y a beaucoup de existing code cela fait bien le travail.
Je suis sûr qu'il existe des moyens plus efficaces pour y parvenir, mais cette méthode répond bien à mes besoins.
@Tim c'est ce que je pensais, mais vous l'avez devant moi! :) –
¬ Vous l'avez eu en premier? :(haha +1 – JCOC611
@TimDown mentionne que l'utilisation d'espaces de noms comme celui-ci n'est pas vraiment supportée nativement et peut rendre le code assez compliqué et difficile à maintenir. meilleures alternatives – Raynos