谁能想到一个更好的解决方案来重组变量a
,使其成为包含其先前值的普通对象?我讨厌这样做,我更喜欢单行,但它必须仍然可读。
a = "somevalue"
b = "somekey"
tmp = a
a = {}
a[b] = tmp
让我重新表述一下:期望的(以及来自上面的代码:实际的)结果是这样的:
a = { "somekey": "somevalue" }
当“somekey”和“somevalue”实际上是变量b
并且a
?
谁能想到一个更好的解决方案来重组变量a
,使其成为包含其先前值的普通对象?我讨厌这样做,我更喜欢单行,但它必须仍然可读。
a = "somevalue"
b = "somekey"
tmp = a
a = {}
a[b] = tmp
让我重新表述一下:期望的(以及来自上面的代码:实际的)结果是这样的:
a = { "somekey": "somevalue" }
当“somekey”和“somevalue”实际上是变量b
并且a
?
你现在拥有的是实现这一目标的方法。
我能看到的唯一清理是尝试将每个变量减少到一个目的 - 使用a
值或对象而不是交换tmp
:
var k = "somekey";
var v = "somevalue";
var a = {};
a[k] = v;
干得好...
(a = (b = [a, b, {}])[2])[b[1]] = b[0];
不能说我会推荐它。
也许这会好一点……
(a = (b = [a, b], {}))[b[1]] = b[0];
当然不会比你拥有的更短。
也许更容易阅读,而且仍然越来越短
(b = [a, b], a = {})[b[1]] = b[0];
怎么样obj = (a...) -> o={}; o[a[i]]=o[a[++i]] for i in [0...a.length]; o
,比myObject = obj key1, val1, key2, val2
?
编辑:假设您的意思是标签中的 CoffeeScript,但问题中并没有真正提到它,其余的答案都在 JavaScript 中。为了完整起见,JavaScript 版本是:
function obj() {
var o={}, i, l=arguments.length;
for (i=0; i<l; i+=2) {
o[arguments[i]] = o[arguments[i+1]];
}
return o;
}
var myObject = obj(key1, val1, key2, val2);
尝试:
tmp = a;
a = {
b: tmp
}
使用表达式时从LiveScript生成的内容中窃取a = {(b): a}
:
a = "somevalue"
b = "somekey"
a = (ref = {}; ref[b] = a; ref)
它仍然需要一个辅助变量,但它在 IMO 中非常易读,现在它是一个单行 =D