Можно ли задать несколько свойств внутри литерала объекта с тем же значением?
Например, могу ли я сделать это?:
{
a: b: c: d: 1,
e: 2,
geh: function() { alert("Hi!") }
}
EDIT:
Есть ли способ избежать этого?:
{
a: 1,
b: 1,
c: 1,
d: 1,
e: 2,
geh: function() { alert("Hi!") }
}
Ответы
Ответ 1
Вы можете установить линию равенства между различными свойствами:
var foo = {};
foo.a = foo.b = foo.c = "Hello";
Или вы можете просто создать метод, который выполняет массовое присвоение для вас:
var foo = {
setValue: function( props, value ) {
while ( props.length ) this[ props.pop() ] = value;
}
}
foo.setValue( [ "a", "b", "c" ] , "Foo" );
Ответ 2
Обновление до этого (с точки зрения последних возможностей JavaScript), избегающего нежелательных определенных варов:
{
let v;
var obj = {
"a": (v = 'some value'),
"b": v,
"c": v
};
}
Это будет означать, что v
не будет определено вне блока, но obj
будет.
Оригинальный ответ
Другой способ сделать то же самое:
var v;
var obj = {
"a": (v = 'some value'),
"b": v,
"c": v
};
Ответ 3
Вы можете попробовать это. Это не синтаксический сахар, который вы ищете (например, {a,b,c:1, d:2}
), но это еще один способ сделать это, хотя все эти ответы очень хороши.
(object,fields,value)=>Object.assign(object||{}, ...fields.map(f=>({[f]:value}) ))
Объяснение:
(object,fields,value)=>
Принимает объект (или значение false, если вы хотите новый объект, не стесняйтесь изменить порядок аргументов)
Object.assign(object||{},
Вернет объект на основе object
, и он будет мутировать объект. Чтобы отключить это, просто добавьте первый литерал объекта аргумента, подобный этому Object.assign({}, object || {}, ...
...fields.map(f=>({[f]:value}) )
Распространяет массив полей, сопоставленных объектам, в виде списка дополнительных аргументов Object.assign
. ['a','b'].map(f=>({[f]:value}) )
даст [{a:value}, {b:value}]
, а f(...[{a:1},{b:1}])
будет как f({a:1},{b:1})
. Object.assign
делает остальные:)
Ответ 4
Можно также закрыть закрытие, если вам не нужны несколько локальных варов. Этот синтаксис кажется популярным (но уродливым):
var obj = (function() { var v='some value'; return { a:v, b:v, c:v }; })();
Ответ 5
Там еще один подход: использование функции отображения...
// 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)