Можно ли задать несколько свойств внутри литерала объекта с тем же значением?

Например, могу ли я сделать это?:

{ 
   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)