当前位置: 首页 > 面试题库 >

如何遍历或枚举JavaScript对象?

公冶谦
2023-03-14
问题内容

我有一个如下的JavaScript对象:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

现在我想通过所有回路p元素(p1p2p3…),并得到他们的键和值。我怎样才能做到这一点?

我可以根据需要修改JavaScript对象。我的最终目标是遍历一些键值对,如果可能的话,我想避免使用eval


问题答案:

您可以使用for-in其他人所示的循环。但是,您还必须确保获得的键是对象的实际属性,而不是来自原型。

这是代码段:

var p = {

    "p1": "value1",

    "p2": "value2",

    "p3": "value3"

};



for (var key in p) {

    if (p.hasOwnProperty(key)) {

        console.log(key + " -> " + p[key]);

    }

}

用Object.keys()替代:

var p = {

    0: "value1",

    "b": "value2",

    key: "value3"

};



for (var key of Object.keys(p)) {

    console.log(key + " -> " + p[key])

}

请注意,使用of for-of代替for- in,如果不使用它将在命名属性上返回未定义,并Object.keys()确保仅使用对象自身的属性,而不使用整个原型链属性

使用新Object.entries()方法:

注意: Internet Explorer本身不支持此方法。您可以考虑将Polyfill用于较旧的浏览器。

const p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (let [key, value] of Object.entries(p)) {
  console.log(`${key}: ${value}`);
}


 类似资料:
  • 问题内容: 我在JavaScript中有一个对象: 我想使用循环来获取其属性。而且我想对其进行迭代(并非一次完成所有对象属性)。 通过一个简单的数组,我可以使用标准循环来做到这一点: 但是如何处理对象呢? 问题答案: 对于大多数对象,请使用: 使用ES6,如果同时需要键和值,请执行 为了避免记录继承的属性,请使用hasOwnProperty进行检查: 如果您使用的是简单对象(例如,您自己创建的对象

  • 我的Flutter项目中有一个Dart枚举,如下所示: 如果我有一些随机枚举状态,如,我如何迭代到下一个枚举(而不需要做一些事情,如用开关语句映射它们)? 我在这个,这个和这个的帮助下找到了答案,所以我把它贴在下面。

  • 我有一个简单的枚举,我想迭代一下。为此,我采用了顺序和迭代器协议,如下面的代码所示。顺便说一句,这可以复制/粘贴到Xcode 8中的游乐场。 但是for in循环生成错误消息“Type”节。Type不符合协议“Sequence”。协议一致性在我的扩展中;那么,这个代码有什么问题? 我知道还有其他方法可以做到这一点,但我想知道这种方法有什么问题。 谢谢

  • 问题内容: 以下代码不起作用,因为Freemarker似乎将[]中的表达式的值强制转换为String,然后将其用作键,这并不是实际期望的值。 准备模板模型: my.ftl: 在Freemarker文档中,描述了如何访问Enum本身,但是我没有找到有关如何使用Enum作为键从哈希中获取值的任何信息。 谢谢。 问题答案: 要对此释义Freemarker文档常见问题, 您不能在myMap [key]表达

  • 运行此代码时: 引发异常: 系统。无效操作异常:集合被修改;枚举操作可能无法执行。 怎么做。NET知道该集合在枚举器迭代该集合时被修改了吗?集合对象中是否有此标志?

  • 问题内容: 如何枚举JavaScript对象的属性? 我实际上想列出所有已定义的变量及其值,但是我了解到定义一个变量实际上会创建window对象的属性。 问题答案: 很简单: 现在,您将无法以这种方式获取私有变量,因为它们不可用。 编辑:是正确的,除非您使用该方法,否则您将获得继承的属性- 但是,我不知道为什么任何熟悉面向对象编程的人都期望得到更少的东西!通常,提起此问题的人会受到道格拉斯·克罗克