web-dev-qa-db-ja.com

オブジェクトリテラル内の複数のプロパティを同じ値に設定できますか?

たとえば、これを行うことができますか?:

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

編集:これを回避する方法はありますか?:

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

さまざまなプロパティ間に等値線を設定できます。

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" );
9
Sampson

(最新の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
};
24
Pebbl

あなたはこれを試すことができます。それはあなたが探している構文上の砂糖ではありません(例えば_{a,b,c:1, d:2}_)が、それを行う別の方法ですが、これらの答えはすべてかなりうまくいきます。

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

説明:

_(object,fields,value)=>
_

オブジェクトを取得します(新しいオブジェクトが必要な場合は誤った値をとります。引数の順序を自由に変更してください)。

_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_残りは:)

3
M3D

複数のローカル変数が必要ない場合は、クロージャーでラップすることもできます。この構文は人気があるようです(ただし醜い)。

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

さらに別のアプローチがあります:マッピング関数の使用...

// 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

使用する for of代わりにループします。

for (let [key, value] of Object.entries(object_name)) {
        object_name[key] = 0; // the value that you want to assign
      }
0
Mahmud hasan