32

例如,我可以这样做吗?:

{ 
   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!") }
}
4

7 回答 7

28

对此的更新(就最新的 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
};
于 2012-10-28T09:08:50.293 回答
13

您可以在各种属性之间设置一条相等线:

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" );
于 2012-10-27T23:17:19.313 回答
3

你可以试试这个。这不是您要寻找的语法糖(例如。{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剩下的:)

于 2017-10-09T06:36:28.640 回答
2

还有另一种方法:使用映射函数......

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

于 2019-01-04T22:52:56.223 回答
1

如果您不想要多个本地变量,您也可以使用闭包。这种语法似乎很流行(但很难看):

var obj = (function() { var v='some value'; return { a:v, b:v, c:v }; })();
于 2015-02-10T15:54:30.357 回答
0

改用for of循环。

for (let [key, value] of Object.entries(object_name)) {
        object_name[key] = 0; // the value that you want to assign
      }
于 2020-03-22T07:23:19.757 回答
0

或者另一种方式:

{...['a', 'b', 'c', 'd'].reduce((obj,prop)=>({...obj, [prop]: 1}), {}) }

通过扩展 Array 原型,它可以非常整齐地包装起来:

Array.prototype.ditto = function(v) { return this.reduce((o,p)=>({...o, [p]: v}), {}) }

所以现在它可以像这样使用:

{ 
    ...['a', 'b', 'c', 'd'].ditto(1),
    ...['e', 'f'].ditto(2)
    geh: function() { alert("Hi!") }
}

解释:.reduce从一个空对象开始,{}并且对于每个元素prop返回一个对象,该对象是对象中已经存在的任何内容,...obj加上一个值为 1: 的新属性[prop]: 1。然后将这些属性展开到以...开头的外部对象中。

如果你有大量的属性 reduce 不是最有效的,但你可以将其更改为:

Array.prototype.ditto = function(v) { let o = {}; this.forEach(p => o[p] = v); return o; }

更易读、更高效但不那么酷??

于 2020-11-10T15:36:52.467 回答