如何循环遍历JavaScript对象中的所有成员,包括作为对象的值?

例如,我如何循环(分别访问“your_name”和“your_message”)?

var validation_messages = {
    "key_1": {
        "your_name": "jimmy",
        "your_msg": "hello world"
    },
    "key_2": {
        "your_name": "billy",
        "your_msg": "foo equals bar"
    }
}

当前回答

此答案是本报告中提供的解决方案的汇总发布一些绩效反馈。我想有两个用例和OP没有提到他是否需要访问密钥才能使用它们在循环过程中。

I.需要访问密钥

✔ of和Object.keys方法

let k;
for (k of Object.keys(obj)) {

    /*        k : key
     *   obj[k] : value
     */
}

✔ 进入方法

let k;
for (k in obj) {

    /*        k : key
     *   obj[k] : value
     */
}

小心使用这个,因为它可以打印obj的原型财产

✔ ES7方法

for (const [key, value] of Object.entries(obj)) {

}

然而,在编辑时,我不推荐ES7方法,因为JavaScript在内部初始化了很多变量来构建这个过程(请参阅反馈以获取证据)。除非你不是在开发一个值得优化的大型应用程序,否则这是可以的,但如果优化是你的首要任务,你应该考虑一下。

二、我们只需要访问每个值

✔ of和Object.values方法

let v;
for (v of Object.values(obj)) {

}

关于测试的更多反馈:

缓存Object.keys或Object.values的性能可以忽略不计

例如,

const keys = Object.keys(obj);
let i;
for (i of keys) {
  //
}
// same as
for (i of Object.keys(obj)) {
  //
}

对于Object.values,在Firefox中使用带有缓存变量的本机For循环似乎比使用For循环快一点。。。循环的。然而,区别并不是那么重要,Chrome正在运行。。。比本机for循环快,所以我建议使用for。。。在任何情况下(第4次和第6次测试)处理Object.values时。在Firefox中。。。in循环非常慢,所以当我们想在迭代期间缓存密钥时,最好使用Object.keys。另外,Chrome正在以相同的速度运行这两个结构(第一次和最后一次测试)。

您可以在此处检查测试:https://jsperf.com/es7-and-misc-loops

其他回答

另一种选择:

var testObj = {test: true, test1: false};
for(let x of Object.keys(testObj)){
    console.log(x);
}

使用lodash_.forEach:

_.forEach({“a”:1,“b”:2},函数(值,键){console.log(键,值);});<script src=“https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js“></script>

2020年,您需要不可变的通用函数

这将遍历由子对象、数组和字符串组成的多维对象,并应用自定义函数:

export const iterate = (object, func) => {
  const entries = Object.entries(object).map(([key, value]) =>
    Array.isArray(value)
      ? [key, value.map(e => iterate(e, func))]
      : typeof value === 'object'
      ? [key, iterate(value, func)]
      : [key, func(value)]
  );
  return Object.fromEntries(entries);
};

用法:

const r = iterate(data, e=>'converted_'+e);
console.log(r);

p是值

for (var key in p) {
  alert(key + ' => ' + p[key]);
}

OR

Object.keys(p).forEach(key => { console.log(key, p[key]) })
var validation_messages = {
    "key_1": {
        "your_name": "jimmy",
        "your_msg": "hello world"
    },
    "key_2": {
        "your_name": "billy",
        "your_msg": "foo equals bar"
    }
}
for (var i in validation_messages) {
    console.log("i = \"" + i + "\"");
    console.log("validation_messages[\"" + i + "\"] = ");
    console.log(validation_messages[i]);
    console.log("\n");
    for (var j in validation_messages[i]) {
        console.log("j = \"" + j + "\"");
        console.log("validation_messages[\"" + i + "\"][\"" + j + "\"] = \"" + validation_messages[i][j] + "\"");
        console.log("\n");
    }
    console.log('\n');
}

输出:

i = "key_1"
validation_messages["key_1"] = 
{
  your_name:"jimmy",
  your_msg:"hello world"
}

j = "your_name"
validation_messages["key_1"]["your_name"] = "jimmy"

j = "your_msg"
validation_messages["key_1"]["your_msg"] = "hello world"


i = "key_2"
validation_messages["key_2"] = 
{
  your_name:"billy",
  your_msg:"foo equals bar"
}

j = "your_name"
validation_messages["key_2"]["your_name"] = "billy"

j = "your_msg"
validation_messages["key_2"]["your_msg"] = "foo equals bar"