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!") }
}
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" );
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.
Une autre façon de faire la même chose est:
var v;
var obj = {
"a": (v = 'some value'),
"b": v,
"c": v
};
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 :)
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 }; })();
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)