115 votes

Comment ajouter automatiquement des propriétés à un objet qui n'est pas défini ?

Existe-t-il un moyen simple d'ajouter automatiquement des propriétés aux objets si elles n'existent pas déjà ?

Prenons l'exemple suivant :

var test = {}
test.hello.world = "Hello doesn't exist!"

Cela ne fonctionne pas car hello n'est pas défini.

La raison pour laquelle je pose cette question est que j'ai quelques objets existants pour lesquels je ne sais pas s'ils ont déjà hello ou pas. En fait, j'ai beaucoup de ces objets dans différentes parties de mon code. Il est très ennuyeux de toujours vérifier si hello existe et s'il n'existe pas crée un nouvel objet comme :

var test = {}
if(test.hello === undefined) test.hello = {}
test.hello.world = "Hello World!"

Existe-t-il un moyen de créer automatiquement un objet du type hello dans cet exemple ?

Je veux dire quelque chose comme ça en php :

$test = array();  
$test['hello']['world'] = "Hello world";   
var_dump($test);

Sortie :

array(1) {
  ["hello"] => array(1) {
    ["world"] => string(11) "Hello world"
  }
}

Ok c'est un tableau mais en js arrays c'est le même problème qu'avec les objets.

5voto

basilikum Points 4196

Vous pourriez étendre le prototype de Object avec une fonction qui renvoie une propriété, mais l'ajoute d'abord, si elle n'existe pas :

Object.prototype.getOrCreate = function (prop) {
    if (this[prop] === undefined) {
        this[prop] = {};
    }
    return this[prop];
};

var obj = {};

obj.getOrCreate("foo").getOrCreate("bar").val = 1;

2voto

Shawn31313 Points 3380
var test = {}
if(!test.hasOwnProperty('hello')) {
    test.hello = {};
}
test.hello.world = "Hello World!"

2voto

finishingmove Points 7927

Cela ajoutera une propriété hello dont la valeur est {world: 'Hello world!'} à l'objet de test, s'il n'existe pas. Si vous avez beaucoup de ces objets, vous pouvez simplement itérer sur eux et appliquer cette fonction. Note : utilise lodash.js

var test = {};
_.defaults(test, { hello: {world: 'Hello world!'} });    

Ce qui est en fait une méthode pratique pour dire :

var defaults = _.partialRight(_.assign, function(a, b) {
  return typeof a == 'undefined' ? b : a;
});        
defaults(test, { hello: {world: 'Hello world!'} });

Nota: _.defaults utilise des boucles pour obtenir la même chose que le deuxième bloc.

P.S. Caisse https://stackoverflow.com/a/17197858/1218080

2voto

Nick Points 511
let test = {};
test = {...test, hello: {...test.hello, world: 'Hello does exist!'}};
console.log(test);

En utilisant l'opérateur d'étalement, la valeur peut être indéfinie, cela créera automatiquement un objet.

1voto

Frederik.L Points 2473

J'ai trouvé quelque chose, très personnalisé également, mais qui fonctionne pour autant que j'aie pu le tester.

function dotted_put_var(str,val) {
    var oper=str.split('.');
    var p=window;
    for (var i=0;i<oper.length-1;i++) {
        var x=oper[i];
        p[x]=p[x]||{};
        p=p[x];
    }
    p[oper.pop()]=val;
}

Ensuite, une variable complexe peut être définie comme ceci, garantissant que tous les liens seront créés s'ils ne le sont pas déjà :

dotter_put_var('test.hello.world', 'testvalue'); // test.hello.world="testvalue";

Voir ce travail FIDDLE .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X