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.

1voto

Michal Politzer Points 68

J'utilise ceci :

Object.prototype.initProperty = function(name, defaultValue) {
  if (!(name in this)) this[name] = defaultValue;
};

Vous pouvez plus tard faire f.e. :

var x = {a: 1};
x.initProperty("a", 2); // will not change property a
x.initProperty("b", 3); // will define property b
console.log(x); // => {a: 1, b: 3}

1voto

VIKAS KOHLI Points 1994
var test = {}
test.hello.world = "Hello doesn't exist!"

Cela va générer une erreur car vous n'avez pas défini le fichier test.hello.

Tout d'abord, vous devez définir la clé d'accueil, puis à l'intérieur vous pouvez attribuer n'importe quelle clé. Mais si vous voulez créer une clé si elle n'existe pas, vous pouvez faire ce qui suit

test.hello = test.hello || {};

L'instruction ci-dessus créera l'objet test.hello s'il n'est pas défini et s'il l'est, il attribuera la même valeur que précédemment.

Maintenant vous pouvez assigner n'importe quelle nouvelle clé à l'intérieur du test.hello

test.hello.world = "Everything works perfect";

test.hello.world2 = 'With another key too, it works perfect';

1voto

Je pense que le moyen le plus simple est d'utiliser _.set de Lodash

 _.set({}, 'a[0].b.c', 4);
// => { a: [{ b: { c: 4 } }] }

0voto

Alisson Nunes Points 316

J'ai fait quelques changements sur la réponse de columbus pour permettre de créer des tableaux :

function addProps(obj, arr, val) {

  if (typeof arr == 'string')
    arr = arr.split(".");

  var tmpObj, isArray = /^(.*)\[(\d+)\]$/.exec(arr[0])
  if (isArray && !Number.isNaN(isArray[2])) {
    obj[isArray[1]] = obj[isArray[1]] || [];
    obj[isArray[1]][isArray[2]] = obj[isArray[1]][isArray[2]] || {}
    tmpObj = obj[isArray[1]][isArray[2]];
  } else {
    obj[arr[0]] = obj[arr[0]] || {};
    tmpObj = obj[arr[0]];
  }

  if (arr.length > 1) {
    arr.shift();
    addProps(tmpObj, arr, val);
  } else
    obj[arr[0]] = val;

  return obj;

}

var myObj = {}
addProps(myObj, 'sub1[0].sub2.propA', 1)
addProps(myObj, 'sub1[1].sub2.propA', 2)

console.log(myObj)

Je pense qu'il est possible d'autoriser l'utilisation de "sub1[].sub2..." pour simplement pousser dans les sub1 au lieu de spécifier l'index, mais c'est suffisant pour moi maintenant.

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