循环访问对象属性

Iterate through object properties

提问人:Rafay 提问时间:11/29/2011 最后编辑:lolbasRafay 更新时间:4/8/2023 访问量:1617046

问:

var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    console.log(propt + ': ' + obj[propt]);
}

变量如何表示对象的属性?它不是内置方法或属性。为什么它会出现对象中的每个属性?propt

JavaScript 循环对象

评论

15赞 noob 11/29/2011
if (typeof(obj[propt]) === 'object') {/* 再做一次 */}
13赞 Rafay 11/29/2011
好吧,对于这个问题,真的很抱歉。我知道什么是循环,我无法理解“遍历对象属性”,我认为现在已经清除了。此外,他们还向我推荐了“JavaScript Step by Step 2nd Edition - Steve Suehring at school.
276赞 Nathan C. Tresch 2/1/2013
这是一个很好的乞丐问题。我要补充一点,我有 15 年的其他语言专业经验,我需要这个答案。如果可以的话,我会加 2000。
74赞 Dave 7/9/2015
很疯狂,但多年来,我每隔几个月就会来一次这个页面,重新学习如何做到这一点的语法。我懒得记住如何做到这一点......我只记得这个页面总是在 SO 上。
19赞 4/4/2017
这是我在 StackOverflow 上看到的最奇怪的页面。如果你仔细阅读这个问题,只有一个答案甚至开始尝试回答实际被问到的问题,它的分数是-6。被接受的最高分答案不仅没有回答,而且完全是错误的。

答:

228赞 Marc B 11/29/2011 #1

它是(MDN,ECMAScript规范)。for...in statement

您可以将其理解为“对于对象中的每个属性,依次将每个属性分配给 PROPT 变量”。obj

评论

1赞 Rafay 11/29/2011
非常感谢,我现在明白了。我砰地想着,翻阅书籍和谷歌。
21赞 Christian C. Salvadó 11/29/2011
同意@RightSaidFred,运算符和语句完全不涉及,for-in 语句本身代表语法生成:,inforfor ( LeftHandSideExpression in Expression )for ( var VariableDeclarationNoIn in Expression )
2赞 Doug Molineux 8/23/2013
奇怪的是,这个答案有如此多的赞成票,特别是因为这些流行的评论似乎与它相矛盾。
10赞 computrius 12/13/2013
为什么这被标记为答案?它很可能是这个线程中最没有帮助的。
3赞 Bumpy 9/21/2016
最没有帮助的答案?取决于您认为 OP 在问什么;当我第一次读到这个问题时,它似乎对变量可用于检查对象属性的机制感到困惑,而这个答案雄辩地解释了这一点(尽管“for-in”用词不当)。我看到的“为什么它会出现每个属性”的问题可能意味着 OP 正在寻找 hasOwnProperty 但不知道,但我认为这更有可能是 OP 想知道的,并且错误地接受了不同问题的正确答案。:-)
44赞 Matt Ball 11/29/2011 #2

这只是一个循环。查看 Mozilla 上的文档for...in

评论

0赞 Burak 2/18/2021
链接已断开:(。
2赞 Matt Ball 2/19/2021
@Burak感谢您让我知道 - 已修复。将来,请随时提出编辑:)
11赞 arb 11/29/2011 #3

您的循环正在遍历对象的所有属性。 在 for 循环的第一行中定义。它是一个字符串,是对象属性的名称。在循环的第一次迭代中,将是“name”。forobjproptobjpropt

10赞 user920041 11/29/2011 #4

JavaScript 中的对象是属性的集合,因此可以在 for 每个语句中循环。

应将其视为键值集合。obj

评论

0赞 Qqwy 11/29/2011
!重要的区别在于,这些“属性列表”可以以名称作为键,而普通的 JS 数组只能以数字作为键。
2587赞 user2417527 5/24/2013 #5

循环访问属性需要以下额外检查:hasOwnProperty

for (var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
        // do stuff
    }
}

这是必要的,因为对象的原型包含对象的其他属性,这些属性在技术上是对象的一部分。这些附加属性继承自基对象类,但仍是 的属性。obj

hasOwnProperty 只是检查这是否是特定于此类的属性,而不是从基类继承的属性。


也可以通过对象本身进行调用:hasOwnProperty

if (obj.hasOwnProperty(prop)) {
    // do stuff
}

但是,如果对象具有同名的不相关字段,则此操作将失败:

var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo');  // TypeError: hasOwnProperty is not a function

这就是为什么调用它更安全的原因:Object.prototype

var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo');  // true

评论

26赞 davidmdem 8/7/2013
@B T 根据 Mozilla 文档:“如果您只想考虑附加到对象本身的属性,而不是其原型,请使用 getOwnPropertyNames 或执行 hasOwnProperty 检查(也可以使用 propertyIsEnumerable)。
7赞 Kyle Richter 4/29/2014
因为,Alex S,对象的原型包含对象的附加属性,这些属性在技术上是对象的一部分。它们继承自基对象类,但它们仍然是属性。hasOwnProperty 只是检查这是否是特定于此类的属性,而不是从基类继承的属性。一个很好的解释:brianflove.com/2013/09/05/javascripts-hasownproperty-method
96赞 Kyle Richter 4/29/2014
但是,我觉得我应该提到,Object.keys(obj) 现在是获取对象本身键的更好的解决方案。链接到 Mozilla 文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
4赞 Ruan Mendes 2/26/2016
@Rafay我真的不明白这个答案与实际问题有什么关系。循环不显示任何继承的属性,除非 OP 修改了 。这可能是个好建议,但你自己说.许多人选择不添加支票。如果您自己创建了对象,并且没有添加一些添加属性的哑库,则无需进行此类检查。Object.prototypeI couldn't get my head around "looping through object properties"hasOwnPropertyObject.Prototype
9赞 Victor Zakharov 7/20/2016
缺少一条重要信息。 这里是一个字符串,应该叫 .否则可能会给像我这样的 JS 新手带来困惑,即在 .propertypropertyNameif
1316赞 Danny R 8/13/2013 #6

从 JavaScript 1.8.5 开始,您可以使用它来获取在对象本身上定义的属性数组(返回 true 的属性数组)。Object.keys(obj)obj.hasOwnProperty(key)

Object.keys(obj).forEach(function(key,index) {
    // key: the name of the object key
    // index: the ordinal position of the key within the object 
});

这比使用 for-in 循环更好(也更易读)。

以下浏览器支持它:

  • Firefox (Gecko):4 (2.0)
  • 铬:5
  • IE浏览器:9

有关更多信息,请参阅Mozilla开发人员网络Object.keys()的参考

评论

8赞 Dom Vinyard 1/29/2014
现在,这得到了更广泛的支持:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
3赞 KyleMit 5/5/2014
如果你需要对旧浏览器的支持,你可以使用这个polyfill
27赞 Todd Price 11/7/2014
在支持此语言构造的环境中,此方法允许调用 Array.foreach:Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
4赞 Daniel Z. 3/23/2017
@AJ_83 没有很好的方法可以打破 forEach()。在本例中使用 some(),并返回 true 以中断
16赞 Jona 7/30/2018
为什么这比 for-in 更具可读性?...对我来说似乎可读for candidate in candidateStatus
4赞 Raman Sohi 3/29/2015 #7

为什么。。in 循环的作用是创建一个新变量(var someVariable),然后将给定对象的每个属性逐个存储在这个新变量(someVariable)中。因此,如果使用块 {},则可以迭代。请看以下示例。

var obj = {
     name:'raman',
     hobby:'coding',
     planet:'earth'
     };

for(var someVariable in obj) {
  //do nothing..
}

console.log(someVariable); // outputs planet

评论

0赞 Katharine Osborne 4/27/2018
鉴于它的简单性,请对此投赞成票。在我的用例中,我需要检查对象中的所有属性是否存在狡猾的值——NaNs、nulls、undefined(它们是图形上的点,这些值阻止了图形的绘制)。要获取值而不是名称,在循环中只需执行 .也许它被否决的原因是因为它不是递归的。因此,如果您有一个高度结构化的对象,这将不是一个适当的解决方案。obj[someVariable]
0赞 bvdb 7/2/2019
@KatharineOsborne,也许是因为下面的短语有点隐晦:“因此,如果你使用块 {},你可以迭代。代码比文本更能说明问题。
21赞 Vappor Washmade 1/24/2016 #8

为了...in 循环表示对象中的每个属性,因为它就像一个 for 循环。您在 for...通过执行以下操作在循环中:

    for(var propt in obj){
alert(propt + ': ' + obj[propt]);
}

一个为...in 循环循环访问对象的可枚举属性。无论您定义哪个变量,或放入 for...在循环中,每次转到它迭代的下一个属性时都会更改。for...in 循环遍历键,但它的值是键的值。例如:

    for(var propt in obj) {
      console.log(propt);//logs name
      console.log(obj[propt]);//logs "Simon"
    }

您可以看到变量与变量值的不同之处。相比之下,一个 for...of 循环则相反。

我希望这会有所帮助。

5赞 Jadiel de Armas 1/29/2016 #9

我想补充上面的答案,因为你可能对 Javascript 有不同的意图。JSON 对象和 Javascript 对象是不同的东西,您可能希望使用上面建议的解决方案遍历 JSON 对象的属性,然后会感到惊讶。

假设您有一个 JSON 对象,如下所示:

var example = {
    "prop1": "value1",
    "prop2": [ "value2_0", "value2_1"],
    "prop3": {
         "prop3_1": "value3_1"
    }
}

迭代其“属性”的错误方法:

function recursivelyIterateProperties(jsonObject) {
    for (var prop in Object.keys(example)) {
        console.log(prop);
        recursivelyIterateProperties(jsonObject[prop]);
    }
}

您可能会惊讶地看到控制台日志记录 、 等。 遍历 和 和 的属性。这些对象是序列,序列的索引是该对象在 Javascript 中的属性。01prop1prop2prop3_1

递归遍历 JSON 对象属性的更好方法是首先检查该对象是否为序列:

function recursivelyIterateProperties(jsonObject) {
    for (var prop in Object.keys(example)) {
        console.log(prop);
        if (!(typeof(jsonObject[prop]) === 'string')
            && !(jsonObject[prop] instanceof Array)) {
                recursivelyIterateProperties(jsonObject[prop]);

            }
            
     }
}
4赞 Ondrej Svejdar 2/11/2016 #10

同时添加递归方式:

function iterate(obj) {
    // watch for objects we've already iterated so we won't end in endless cycle
    // for cases like var foo = {}; foo.bar = foo; iterate(foo);
    var walked = [];
    var stack = [{obj: obj, stack: ''}];
    while(stack.length > 0)
    {
        var item = stack.pop();
        var obj = item.obj;
        for (var property in obj) {
            if (obj.hasOwnProperty(property)) {
                if (typeof obj[property] == "object") {
                  // check if we haven't iterated through the reference yet
                  var alreadyFound = false;
                  for(var i = 0; i < walked.length; i++)
                  {
                    if (walked[i] === obj[property])
                    {
                      alreadyFound = true;
                      break;
                    }
                  }
                  // new object reference
                  if (!alreadyFound)
                  {
                    walked.push(obj[property]);
                    stack.push({obj: obj[property], stack: item.stack + '.' + property});
                  }
                }
                else
                {
                    console.log(item.stack + '.' + property + "=" + obj[property]);
                }
            }
        }
    }
}

用法:

iterate({ foo: "foo", bar: { foo: "foo"} }); 

评论

1赞 Ondrej Svejdar 2/22/2016
@faiz - 请参阅我的评论,当您反复走过具有循环引用的对象时,可以防止陷入无限循环
4赞 Faiz Mohamed Haneef 2/22/2016 #11

在这里,我将迭代每个节点并创建有意义的节点名称。如果您注意到,instanceOf Array 和 instanceOf Object 几乎做同样的事情(在我的应用程序中,我给出了不同的逻辑)

function iterate(obj,parent_node) {
    parent_node = parent_node || '';
    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            var node = parent_node + "/" + property;
            if(obj[property] instanceof Array) {
                //console.log('array: ' + node + ":" + obj[property]);
                iterate(obj[property],node)
            } else if(obj[property] instanceof Object){
                //console.log('Object: ' + node + ":" + obj[property]);
                iterate(obj[property],node)
            }
            else {
                console.log(node + ":" + obj[property]);
            }
        }
    }
}

注意 - 我受到 Ondrej Svejdar 回答的启发。但此解决方案具有更好的性能和更少的歧义

22赞 Rob Sedgwick 3/29/2016 #12

jQuery现在允许您执行此操作:

$.each( obj, function( key, value ) {
  alert( key + ": " + value );
});

评论

2赞 Bob Stein 4/4/2018
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})$.each 不适合对象。如果一个对象恰好有一个 length 属性,并且它的值恰好为零,则整个对象将被视为一个空数组。
1赞 Bob Stein 4/4/2018
详细说明为什么我认为这是一种诱发错误的方法
4赞 HovyTech 6/24/2016 #13

基本上,您希望遍历对象中的每个属性。

JSFiddle

var Dictionary = {
  If: {
    you: {
      can: '',
      make: ''
    },
    sense: ''
  },
  of: {
    the: {
      sentence: {
        it: '',
        worked: ''
      }
    }
  }
};

function Iterate(obj) {
  for (prop in obj) {
    if (obj.hasOwnProperty(prop) && isNaN(prop)) {
      console.log(prop + ': ' + obj[prop]);
      Iterate(obj[prop]);
    }
  }
}
Iterate(Dictionary);
12赞 Redu 8/9/2016 #14

现在,只需添加 Symbol.iterator 方法,即可将标准 JS 对象转换为可迭代对象。然后,您可以使用循环并直接访问其值,甚至可以在对象上使用扩展运算符。凉。让我们看看如何做到这一点:for of

var o = {a:1,b:2,c:3},
    a = [];
o[Symbol.iterator] = function*(){
                       var ok = Object.keys(this);
                            i = 0;
                       while (i < ok.length) yield this[ok[i++]];
                     };
for (var value of o) console.log(value);
// or you can even do like
a = [...o];
console.log(a);

评论

1赞 Benj 1/27/2017
有趣的方法。感谢您的发现!function*
0赞 Dmitry 10/16/2020
不错,如果属性也是对象,您甚至可以使用方法!
260赞 user663031 9/13/2016 #15

在 ES 的最新实现中,您可以使用 Object.entries

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

Object.entries(obj).forEach(([key, value]) => ...)

如果只想遍历值,请使用 Object.values:

for (const value of Object.values(obj)) { }

Object.values(obj).forEach(value => ...)

评论

1赞 Mario 10/4/2017
这将是最好的解决方案(object.entries...),但我不能使用它。当您想多次执行此操作并且无法在框架中支持它时,可以使用此页面上的 polyfill:developer.mozilla.org/nl/docs/Web/JavaScript/Reference/...
0赞 gnzg 4/25/2018
如果您只使用属性的值,则第三个建议很棒。棒!
0赞 OzzyCzech 7/28/2021
这是最好的答案,你应该使用for (const [key, value] of Object.entries(obj)) { }
14赞 viktarpunko 11/5/2016 #16

您可以使用 Lodash。文档

var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
    ...
});

评论

11赞 brettwhiteman 9/30/2017
为什么这个“答案”有 10 个赞成票?它完全无法回答这个问题。我开始对普通 JS 开发人员的智慧失去信心。
1赞 viktarpunko 10/2/2017
@developerbmw我知道使用 ES6 功能更正确的方法,但我在一年前就回答过了。请在有时间时与我们分享您的想法。
1赞 6/20/2018
这个想法是更多地关注本机方法,而不是建议用户在他们的页面上添加一个 10000 行的库。不要误会我的意思,我确实喜欢使用 Lodash,但它有时间和地点,但不是这个。
0赞 Brian Burns 9/11/2020
@user9016207这个答案来自 2016 年,当时更适用 - 特别是如果您已经在使用 Lodash。如今,如果您需要 Lodash 的单个 FN,您可以一次获得一个,例如 npmjs.com/package/lodash.keys
380赞 Frank Roth 11/22/2016 #17

女孩和男孩,我们在 2019 年,我们没有那么多时间打字......因此,让我们做这个很酷的新花哨的 ECMAScript 2016:

Object.keys(obj).forEach(e => console.log(`key=${e}  value=${obj[e]}`));

评论

23赞 krillgar 1/11/2017
这与Danny R的回答有什么不同?
28赞 Frank Roth 1/13/2017
它是一个单行字,使用 map 而不是 forEach。而且控制台 .log 存储对某些人来说可能很有趣。
0赞 Michaelangel007 2/2/2017
Satly,这在以下情况下不起作用:-/哪里有。即obj=window.performance.memoryfor invar obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
2赞 Frank Roth 2/2/2017
window.performance.memory仅受 chrome 支持,并返回一个空数组。这与.Object.keys(obj).map
0赞 kayleeFrye_onDeck 4/20/2017
如果有人不想重新构建这个单行线以一次做不止一件事,我已经发布了这个要点。它基本上就像大多数哈希实现一样,使用而不是 ,但如果你以前没有处理过这个问题,它可以帮助你更好地可视化它: gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8e((key)=>(value)){key=>value}
20赞 Philll_t 5/6/2017 #18
let obj = {"a": 3, "b": 2, "6": "a"}

Object.keys(obj).forEach((item) => {console.log("item", obj[item])})

// a
// 3
// 2

评论

3赞 Danny 11/11/2018
如其他注释中所述,在这里更合适,因为它旨在返回一个新数组,其中包含在每次迭代中调用代码块的结果。但是我们只对每次迭代的副作用感兴趣,而不是对返回值感兴趣,因此我们不需要给我们的新数组。forEachmapmap
7赞 Justin 8/11/2017 #19

如果运行 Node,我建议:

Object.keys(obj).forEach((key, index) => {
    console.log(key);
});
1赞 Konrad Kiss 8/29/2017 #20

为了进一步细化已接受的答案,值得注意的是,如果使用 then 实例化对象,将触发 TypeError。因此,为了安全起见,您需要从原型中调用它,如下所示:var object = Object.create(null)object.hasOwnProperty(property)

for (var property in object) {
    if (Object.prototype.hasOwnProperty.call(object, property)) {
        // do stuff
    }
}
31赞 JSON C11 10/8/2017 #21

如果您的环境支持 ES2017,那么我推荐 Object.entries

Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key} ${value}`);
});

Mozillas Object.entries() 文档所示:

Object.entries() 方法返回给定对象自己的数组 可枚举属性 [key, value] 对,顺序相同 由一个提供...in 循环(区别在于 for-in 循环 也枚举原型链中的属性)。

基本上,使用 Object.entrys,我们可以放弃以下额外的步骤,这是较旧的 for...循环中

// This step is not necessary with Object.entries
if (object.hasOwnProperty(property)) {
  // do stuff
}
18赞 dylanh724 10/28/2017 #22

上面的答案有点烦人,因为它们没有解释你在确保它是一个对象后在 for 循环中做了什么:你不直接访问它!实际上,您只收到了应用于 OBJ 所需的 KEY:

var obj = {
  a: "foo",
  b: "bar",
  c: "foobar"
};

// We need to iterate the string keys (not the objects)
for(var someKey in obj)
{
  // We check if this key exists in the obj
  if (obj.hasOwnProperty(someKey))
  {
    // someKey is only the KEY (string)! Use it to get the obj:
    var myActualPropFromObj = obj[someKey]; // Since dynamic, use [] since the key isn't literally named "someKey"

    // NOW you can treat it like an obj
    var shouldBeBar = myActualPropFromObj.b;
  }
}

这一切都是 ECMA5 安全的。甚至可以在蹩脚的JS版本中工作,如Rhino;)

评论

0赞 Antony Hatchkins 7/16/2020
shouldBeBar对于所有三个迭代,均未定义。
0赞 dylanh724 7/17/2020
undefined是不可能的,因为它在你面前被清楚地定义:)这扣除了 2 种可能性:(1) 您是否在 if() 块之外检查 shouldBeBar?那么是的,它将是未定义的(超出范围)。或者 (2) 你打错了 var 名称吗?
26赞 Cyril N. 1/19/2018 #23

多米尼克的回答很完美,我只是更喜欢这样做,因为它读起来更干净:

for (var property in obj) {
    if (!obj.hasOwnProperty(property)) continue;

    // Do stuff...
}

评论

0赞 Jonathan 1/7/2020
不过应该用大写的 o,不是吗?Object
1赞 shrekuu 1/28/2021
@Jonathan 请注意,它是第一行中的变量。object
0赞 Cyril N. 1/28/2021
我已经更新了代码以避免混淆;)
13赞 Fellow Stranger 4/25/2018 #24
Object.keys(obj).forEach(key =>
  console.log(`key=${key} value=${obj[key]}`)
);
19赞 Dimitar Nikovski 6/28/2018 #25

添加 ES2015 对属性的用法,并通过迭代器迭代属性。Reflect.ownKeys(obj)

例如:

let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } };

可以通过以下方式进行迭代

// logs each key
Reflect.ownKeys(obj).forEach(key => console.log(key));

如果要直接遍历对象键的值,可以定义一个 ,就像 JavaScipts 的字符串、数组、类型化数组、Map 和 Set 的默认迭代器一样。iterator

JS 将尝试通过默认迭代器属性进行迭代,该属性必须定义为 .Symbol.iterator

如果您希望能够遍历所有对象,可以将其添加为 Object 的原型:

Object.prototype[Symbol.iterator] = function*() { 
    for(p of Reflect.ownKeys(this)){ yield this[p]; }
}

这将使您能够循环访问对象的值,并带有...of 循环,例如:

for(val of obj) { console.log('Value is:' + val ) }

注意:在撰写此答案时(2018 年 6 月),除 IE 外,所有其他浏览器都支持生成器并通过for...ofSymbol.iterator

评论

1赞 Michiel 5/29/2019
虽然你实际上并没有回答OP的问题,但这对我来说很有帮助,我还不知道Reflect。
6赞 Alwaysblue 6/10/2019 #26

虽然最受好评的答案是正确的,但这里有一个替代用例,即如果你正在迭代一个对象并最终想要创建一个数组。使用代替.mapforEach

const newObj = Object.keys(obj).map(el => {
    //ell will hold keys 
   // Getting the value of the keys should be as simple as obj[el]
})
39赞 Fouad Boukredine 11/13/2019 #27
if (typeof obj === 'object' && obj !== null) {
    Object.keys(obj).forEach(key => {
        console.log("\n" + key + ": " + obj[key]);
    });
}

// *** Explanation line by line ***

// Explaining the bellow line
// It checks if obj is neither null nor undefined, which means it's safe to get its keys. 
// Otherwise it will give you a "TypeError: Cannot convert undefined or null to object" if obj is null or undefined when it tries to get its keys in the next line of code.
// NOTE 1: You can use Object.hasOwnProperty() instead of Object.keys(obj).length
// NOTE 2: No need to check if obj is an array because it will work just fine.
// NOTE 3: No need to check if obj is a string because it will not pass the 'if typeof obj is Object' statement.
// NOTE 4: No need to check if Obj is undefined because it will not pass the 'if type obj is Object' statement either.
if (typeof obj === 'object' && obj !== null) {

    // Explaining the bellow line
    // Just like in the previous line, this returns an array with
    // all keys in obj (because if code execution got here, it means 
    // obj has keys.) 
    // Then just invoke built-in javascript forEach() to loop
    // over each key in returned array and calls a call back function 
    // on each array element (key), using ES6 arrow function (=>)
    // Or you can just use a normal function ((key) { blah blah }).
    Object.keys(obj).forEach(key => {

        // The bellow line prints out all keys with their 
        // respective value in obj.
        // key comes from the returned array in Object.keys(obj)
        // obj[key] returns the value of key in obj
        console.log("\n" + key + ": " + obj[key]);
    });
}

评论

3赞 Nicolas 11/13/2019
嗨,您能否添加有关您的答案的更多信息,仅提供代码无济于事。
0赞 Fouad Boukredine 11/13/2019
嗨@Nicolas我在代码中添加了一行一行的解释。如果还不清楚,请告诉我
5赞 Darkproduct 12/19/2019
因为跳过空值,我认为你可以去掉 if 和 just do 就像 Frank Roth 的答案一样。forEachObject.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
1赞 Kamil Kiełczewski 6/27/2020 #28

检查类型

您可以通过以下方式检查 propt 如何表示对象 propertis

typeof propt

发现它只是一个字符串(属性名称)。由于 for-in js“内置”循环的工作方式,它提出了对象中的每个属性。

var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    console.log(typeof propt,  propt + ': ' + obj[propt]);
}

17赞 Sunny 10/6/2020 #29

您可以使用 and 循环访问对象的嵌套属性。for...inforEach

为。。。在:

for (const key in info) {
    console.log(info[key]);
}

forEach:

Object.keys(info).forEach(function(prop) {
    console.log(info[prop]);
    // cities: Array[3], continent: "North America", images: Array[3], name: "Canada"
    // "prop" is the property name
    // "data[prop]" is the property value
});
0赞 danday74 7/30/2021 #30

如果您只想迭代以映射属性值,那么 lodash 具有_.mapValues

const obj = {
  a: 2,
  b: 3
}
const res = _.mapValues(obj, v => v * 2)
console.log(res)
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>