例如,我可以这样做吗?:
{
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!") }
}
答案 0 :(得分:21)
对此进行更新(根据最新的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
};
答案 1 :(得分:8)
您可以在各种属性之间设置一条相等的行:
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 :(得分:3)
你可以试试这个。这不是你正在寻找的语法糖(例如。{a,b,c:1, d:2}
),但它是另一种方法,尽管所有这些答案都非常好。
(object,fields,value)=>Object.assign(object||{}, ...fields.map(f=>({[f]:value}) ))
<强>解释强>
(object,fields,value)=>
获取一个对象(如果你想要一个新对象,可以使用falsey值,随意重新排列参数顺序)
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 :(得分:1)
如果你不想要多个本地变量,你也可以包装一个闭包。这种语法似乎很流行(但很难看):
var obj = (function() { var v='some value'; return { a:v, b:v, c:v }; })();
答案 4 :(得分:0)
还有另一种方法:使用映射功能...
// 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)
答案 5 :(得分:0)
改为使用after_touch :recompute_total_units
private
def recompute_total_units
update_column(:total_units, positions.sum(:volume))
end
循环。
for of
答案 6 :(得分: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
。然后将这些属性以...
开头扩展到外部对象。
如果您拥有大量的财产,减少损失并不是最有效的方法,但是您可以将其更改为:
Array.prototype.ditto = function(v) { let o = {}; this.forEach(p => o[p] = v); return o; }
更具可读性和效率,但不那么酷?