1

谁能想到一个更好的解决方案来重组变量a,使其成为包含其先前值的普通对象?我讨厌这样做,我更喜欢单行,但它必须仍然可读。

a = "somevalue"
b = "somekey"

tmp = a
a = {}
a[b] = tmp

让我重新表述一下:期望的(以及来自上面的代码:实际的)结果是这样的:

a = { "somekey": "somevalue" }

当“somekey”和“somevalue”实际上是变量b并且a

4

5 回答 5

4

你现在拥有的是实现这一目标的方法。

我能看到的唯一清理是尝试将每个变量减少到一个目的 - 使用a值或对象而不是交换tmp

var k = "somekey";
var v = "somevalue";

var a = {};
a[k] = v;
于 2012-06-01T22:13:19.907 回答
2

干得好...

(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];
于 2012-06-01T22:26:41.297 回答
1

怎么样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);
于 2012-06-03T15:32:17.550 回答
0

尝试:

tmp = a;
a = {
    b: tmp
}
于 2012-06-01T21:59:07.703 回答
0

使用表达式时从LiveScript生成的内容中窃取a = {(b): a}

a = "somevalue"
b = "somekey"

a = (ref = {}; ref[b] = a; ref)

它仍然需要一个辅助变量,但它在 IMO 中非常易读,现在它是一个单行 =D

于 2012-06-02T15:58:01.243 回答