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

标签 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已经定义了。

最佳答案

除非您想使用 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'});

关于javascript - 如何用单个表达式定义递归对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45747598/

相关文章:

javascript - Babel 无法在主 Node.js 应用程序之外工作

javascript - 如何使动态插入的 html 对象可点击?

javascript - 防止 knockout textInput 数据绑定(bind)在键入时更新字段值

javascript - 在单个 Controller 中生成一个对话框。 Angular.js

javascript - 在 Aptana 中使用关键字作为对象键会引发语法错误

javascript - UWP Xbox One : Saving and loading data

javascript - new到底在做什么?

javascript - 在 React 中使用 refs 有什么不好的做法?

javascript - 简单的提示测验javascript,弹出问题显示所有问题

javascript - Console.log 在使用 grunt 服务器的 Qunit 测试中不起作用