在 js 中为什么如下方式会找不到值?

2023-01-04 10:38:41 +08:00
 qq309187341
let a = {
b: {
c: {
d: 1
}
}
}

let z = 'c.d'
console.log(a.b[z]) // undefined
为什么?
如何才能正常找到
3534 次点击
所在节点    JavaScript
35 条回复
caocong
2023-01-04 12:06:32 +08:00
z.split('.').reduce((res, val)=>res[val],a.b)
venfiw
2023-01-04 12:52:02 +08:00
let a = {
b: {
c: { d: 1}
}
}

let z = 'c.d';
console.log(a.b[z]) // undefined
console.log(Object.keys(a.b))

你可以通过这个可以看到 a.b 里只有一个键值:'c' 并没有'c.d'
如果你把 c 改为‘c.d' 那么 a.b[z]就可以正常输出
777777
2023-01-04 14:32:53 +08:00
写 go 的,看见这种语法直接震惊
aust
2023-01-04 14:43:14 +08:00
这种写法你要打印的写法等同于
{
"c.d": 1
} 而不是 {
c: {
d: 1
}
}
Arthit
2023-01-04 16:12:20 +08:00
console.log(a.b["c"]["d"]);
libook
2023-01-04 16:18:47 +08:00
题主提供了一个典型的 bug 案例。因为实际工程上,更多的情况是我们会预期给 z 传入单个字段名,但意外传入路径就 bug 了。所以通常这样用需要小心,如果 z 是用户输入的要做好校验。
weixiangzhe
2023-01-04 16:54:12 +08:00
那就是手写个 get
```js
function get(obj, path, def) {
var fullPath = path
.replace(/\[/g, '.')
.replace(/]/g, '')
.split('.')
.filter(Boolean);

return fullPath.every((step)=>{
return !(step && (obj = obj[step]) === undefined);
}) ? obj : def;
}

let a = {
b: {
c: {
d: 1
}
}
}

let z = 'c.d'
// console.log(a.b[z]) // undefined


console.log(get(a,'b.c.d'))


```
horseInBlack
2023-01-04 17:06:32 +08:00
const {
b: {
c: { d: z },
},
} = a;

console.log(z);

连续解构赋值
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
chenyu0532
2023-01-04 18:07:58 +08:00
连续解构赋值吧。
你们玩的是真 high ,学习归学习,工作里我可不敢这么用,怕同事打我
z782297190
2023-01-04 18:19:48 +08:00
字符串 . 和 属性访问器 . 是不同的,js 引擎不认字符串 .
enchilada2020
2023-01-04 18:29:18 +08:00
@777777 小场面 莫慌莫慌 写 JS 的震惊。。
mwjz
2023-01-04 18:38:39 +08:00
let a = {
b: {
c: {
d: 1
}
}
}

let z = 'c.d'

const c = z.split('.').reduce((pre, curr) => pre[curr], a.b);
imingyu
2023-01-04 18:42:57 +08:00
为什么?
因为你语法写错了!
为什么语法是 a.b.c.d 而不是 a.b['c.d']?
因为规定!
lynan
2023-01-04 20:51:57 +08:00
https://imgur.com/EHwVAgx.png
这样写才可以取到值,因为在[]里是 key 名
lynan
2023-01-04 20:52:44 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/906438

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX