回答

收藏

如何循环或枚举 JavaScript 对象?

技术问答 技术问答 300 人阅读 | 0 人回复 | 2023-09-11

我有一个 JavaScript 对象,如下:  m6 R1 ~% u, q1 [
    var p =    "p1": "value1",   "p2": "value2",   "p3": "value3"};. U1 T% K- [; {4 k2 ?4 |; I
现在我想遍历一切p元素(p1,p2,p3…)并获得它们的键和值。我怎样才能做到这一点?
2 B6 i9 ~! q9 ]+ Z; W- C如有必要,我可以修改 JavaScript 对象。我的最终目标是遍历一些键值对,如果可能的话,我想避免使用eval.
" x: N: y8 L6 E: Q& B2 l2 E  T                                                               
1 L) x& J0 M  E2 ^7 i3 o) E    解决方案:                                                                $ w- e, n" w% M$ ?; |/ C3 b& `5 r
                                                                您可以使用for-in其他人所示的循环。但是,你必须确保你得到的密钥是物体的实际属性,而不是原型。
) o1 O3 E2 s6 M8 j, X这是片段:1 `" X& h" d+ N: [% c! }0 i
    var p =    "p1": "value1",   "p2": "value2",   "p3": "value3"};for (var key in p)    if (p.hasOwnProperty(key))        console.log(key   " -> "   p[key]);    }}
    ! C3 g! F* i) d/ y  Z- E
使用 Object.keys() 替代方案:
* g* V5 a9 G7 y: _- O) T
    var p =     0: "value1",   "b": "value2",   key: "value3"};for (var key of Object.keys(p))    console.log(key   " -> "   p[key])}
    0 C- ^+ B+ p3 C+ G  ?7 K
Run code snippet
3 ^2 F5 f/ e: Z6 {( V+ EExpand snippet
# R+ a, M! o$ U注意使用for-of而不是for-in,如果不使用,它将返回未定义的命名属性,并且Object.keys()确保只使用对象本身的属性而不使用整个原型链属性: c' h) y! f; h! }& A9 I- M
使用新Object.entries()方法:* T2 _3 @. ?+ p- t" r1 e8 d: q
注意:    Internet Explorer 本身不支持此方法。您可以考虑为旧版浏览器使用 Polyfill。
, ?! m) p( l! M0 b
    const p =    "p1": "value1",   "p2": "value2",   "p3": "value3"};for (let [key,value] of Object.entries(p)) {  console.log(`${key}: ${value}`);}
    % z& }" O1 u; \+ ]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则