web-dev-qa-db-fra.com

Peut-on définir plusieurs propriétés à l'intérieur d'un littéral d'objet avec la même valeur?

Par exemple, puis-je faire cela ?:

{ 
   a: b: c: d: 1,
   e: 2,
   geh: function() { alert("Hi!") }
}

EDIT: Y a-t-il un moyen d'éviter de faire cela ?:

{ 
   a: 1,
   b: 1,
   c: 1,
   d: 1,
   e: 2,
   geh: function() { alert("Hi!") }
}
19
PitaJ

Vous pouvez définir une ligne d'égalité entre différentes propriétés:

var foo = {};
foo.a = foo.b = foo.c = "Hello";

Ou vous pouvez simplement créer une méthode qui effectue l'affectation en masse pour vous:

var foo = {
    setValue: function( props, value ) {
        while ( props.length ) this[ props.pop() ] = value;
    }
}

foo.setValue( [ "a", "b", "c" ] , "Foo" );
8
Sampson

Une mise à jour de cette fonctionnalité (en termes des dernières capacités JavaScript) évitant les vars définis indésirables:

{
  let v;
  var obj = {
     "a": (v = 'some value'),
     "b": v,
     "c": v
  };
}

Cela signifie que v ne sera pas défini en dehors du bloc, mais obj le sera.

Réponse originale

Une autre façon de faire la même chose est:

var v;
var obj = {
     "a": (v = 'some value'),
     "b": v,
     "c": v
};
21
Pebbl

Tu pourrais essayer ça. Ce n'est pas le sucre syntaxique que vous recherchez (par exemple, {a,b,c:1, d:2}) mais c'est une autre façon de le faire, même si toutes ces réponses sont très bien.

(object,fields,value)=>Object.assign(object||{}, ...fields.map(f=>({[f]:value}) ))

Explication:

(object,fields,value)=>

Prend un objet (ou une valeur falsey si vous voulez un nouvel objet, n'hésitez pas à réorganiser l'ordre des arguments)

Object.assign(object||{},

Retourne un objet basé sur object et / il mue l'objet. Pour désactiver ceci, ajoutez simplement un littéral d'objet de premier argument comme ceci: Object.assign({}, object || {}, ...

...fields.map(f=>({[f]:value}) )

Étendra le tableau de champs mappés aux objets sous forme de liste d'arguments supplémentaires à Object.assign. ['a','b'].map(f=>({[f]:value}) ) donnera [{a:value}, {b:value}] et f(...[{a:1},{b:1}]) est comme f({a:1},{b:1}). Object.assign fait le reste :)

3
M3D

Vous pouvez aussi envelopper une fermeture si vous ne voulez pas plusieurs vars locaux. Cette syntaxe semble être populaire (mais moche):

var obj = (function() { var v='some value'; return { a:v, b:v, c:v }; })();
1
raider33

Il existe encore une autre approche: utiliser une fonction de cartographie ...

// This will be standard! 
if (!Object.fromEntries)
  Object.fromEntries = entries => entries.reduce ((o, [key, value]) => ({
     ...o,
     [key]: value
  }), {})


const setSameValue = (source, props, value) => ({
  ...source,
  ...Object.fromEntries (
     props.map (prop => [prop, value])
  )
})

// The important part: do what you want with ease!
const output = setSameValue ({}, ['1', '01'], 'string 1')

const obj = { x: 1, y: 'hello' }

const output2 = setSameValue (obj, ['1', '01'], 'string1')

console.log ('output1:', output)
console.log ('output2:', output2)

0