在 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
为什么?
如何才能正常找到
3515 次点击
所在节点    JavaScript
35 条回复
DingJZ
2023-01-04 10:40:59 +08:00
js 本来就不支持这种玩法,可以用第三方的库,lodash 之类的
qq309187341
2023-01-04 10:42:51 +08:00
@DingJZ 不借用第三方,有什么别的写法,如果 z 只有一层 z='c'这样是能找到 c 的,但是再加一层就找不到了
GressJoe
2023-01-04 10:43:20 +08:00
eval ,不过容易 boom
vagary
2023-01-04 10:46:24 +08:00
哈哈哈哈哈
a={b:{'c.d':1}}; z='c.d'; console.log(a.b[z])能找到
DOLLOR
2023-01-04 10:47:21 +08:00
要么直接用 lodash ,要么自己参考 lodash 的源码自己实现一个 get 方法。
我倒是好奇有什么编程语言能这样来的?
thinkershare
2023-01-04 10:48:19 +08:00
因为 c.d 是一个合法的属性,JS 的对象本质是个 string|symbol-> any 的字典映射。
chenmobuys
2023-01-04 10:49:41 +08:00
啥语言能这样写,这估计是第三方库的处理吧
wangtian2020
2023-01-04 10:53:34 +08:00
let a = {
b: {
c: {
d: 1,
},
},
}

let z = 'c.d'
console.log(eval(`a.b.${z}`)) // 1
rongchuan
2023-01-04 10:53:51 +08:00
@qq309187341
你声明的'c.d'是一个 string 。a.b[z]是从 a 的 b 属性这个对象上,去找 key 值是 z 的 value ,也就是找 key 值是'c.d'的 value 。显然没有这个 value
这跟第三方库没关系,你没有理解 key 的概念,.不是随便就能.的
lower
2023-01-04 10:54:56 +08:00
a.b['c']['d'] 能找着🤣
qq309187341
2023-01-04 10:55:36 +08:00
@rongchuan 哦。我明白了,c.d 是一个整体,而不是 c 下的 d 。所以合在一起就成了 a.b.'c.d'是这样对吧。哈哈哈哈
qq309187341
2023-01-04 10:56:42 +08:00
@lower 哈哈哈,你这个也行。我理解错了。确实要用你这样的写法才可以
heishu
2023-01-04 11:31:27 +08:00
#8 和 #10 是两种可行的方法,一个是处理字符串,一个是对象依次找值
pendulum
2023-01-04 11:34:18 +08:00
有点想当然了,JS 根本没有这种特性
hervey0424
2023-01-04 11:38:37 +08:00
let a = { 'b.c': 123, b: { c: 456 } };
console.log(a.b.c); // 456
console.log(a['b.c']); //123
enchilada2020
2023-01-04 11:41:19 +08:00
我居然看了好久才明白你的代码意图是什么。。。。所以反过来我想问的是 哪个语言能支持你这样的写法取值?
mynameislihua
2023-01-04 11:44:09 +08:00
lodash get
webcape233
2023-01-04 11:49:37 +08:00
什么样的需求这是...
zhouyg
2023-01-04 11:55:56 +08:00
根本原因 js 不知道你传入的 c.d 是一个整体的字符串 key 还是可以分割的访问 key ,这里是有歧义的。支持这个特性也很简单,那就是在语言层面新增一个语法来消除这个歧义
3000codes
2023-01-04 11:57:02 +08:00
可以用 Object.defineProperty 劫持它的 key,然后把 c.d 转化一下

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

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

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

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

© 2021 V2EX