如何使用单个表达式定义递归对象?

时间:2017-08-18 02:28:44

标签: javascript

例如,给定此对象:

let foo = {foo:1};
let bar = {a:foo,b:foo};

我们可以将bar定义为单个表达式,方法是将其写为:

let bar = (($0)=>({a:$0={foo:1},b:$0}))()

但是,考虑到这个目标:

let o = {a:'perfect'};
o.circle = o;

是否可以使用单个表达式重新创建o的结构?

这不起作用:

(($0)=>($0={a:"perfect",circle:$0}))()

因为嵌套circle并且尚未定义$0

1 个答案:

答案 0 :(得分:1)

除非你想用getter属性来解决这个问题,否则分配是不可避免的。

即使在单个表达式中,也有各种方法可以做到这一点:

let o = (o = {a:'perfect'}).circle = o;

但我建议关注清晰度并改用IIFE:

const o = (function(){
    const x = {a:'perfect'};
    x.circle = x;
    return x;
}());
// more like the first solution but without the mutable `o` variable:
const o = (x => x.circle = x)({a:'perfect'});