繁体   English   中英

使用默认值解构嵌套对象的更简洁方法?

[英]Cleaner way to destructure nested objects with defaults?

我有一个嵌套对象,它可能缺少一些东西:

const unreliableObject = {
    id: 10,
    nestedObject: { // may be missing
        id: 11 // may also be missing
    }
}

现在说我想获取内部 ID。 可以执行以下操作

const { nestedObject: { id: key = -1 } = {key: -1} } = unreliableObject;
console.log(key);

有没有更好的办法? 我没有定义{key: -1}两次,也没有使用空对象(我们有 lint 规则),在这种情况下我仍然想使用默认键。

如果您愿意接受类似于Lodash 的 get的路径符号和使用 Proxy 对象,那么您可以将p['xyz']转换为安全的pxyz操作:

 const {'xyz': a = 42} = path({}); const {'xyz': b = 42} = path({x: {}}); const {'xyz': c = 42} = path({x: {z: {}}}); const {'xyz': d = 42} = path({x: {y: {z: 999}}}); console.log(a, b, c, d);
 <script> const path = obj => new Proxy(obj, { get(o, k) { const [head, ...tail] = k.split('.'); return tail.length === 0 ? o[head] : path(o[head] != null ? o[head] : {})[tail.join('.')]; } }); </script>


如果您愿意不使用解构并接受更多代理魔法,那么我们可以做其他疯狂的事情,例如将属性转换为函数!

const p = path(/* some object */);
p.x.y.z(42);
// either the value at 'x.y.z' or 42

 const a = path({}); const b = path({x: {}}); const c = path({x: {z: {}}}); const d = path({x: {y: {z: 999}}}); console.log(axyz(42), bxyz(42), cxyz(42), dxyz(42));
 <script> const path = obj => new Proxy(obj, { get: (o, k) => o[k] == null ? path(x => x) : typeof o[k] === 'object' ? path(o[k]) : () => o[k] }); </script>


这可能是过度设计的,但无论如何我还是想玩弄 Proxy ;) 也许这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM