遍历对象属性

问:

var obj = { 名称:“西蒙”,年龄:“20”,服装:{ 风格:“简单”,时髦:假 } } for(var propt in obj){ console.log(propt + ': ’ + obj[道具]); }

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

答1:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

迭代属性需要额外的 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

@BT 根据Mozilla documentation:“如果您只想考虑附加到对象本身的属性,而不是其原型,请使用 getOwnPropertyNames 或执行 hasOwnProperty 检查(也可以使用propertyIsEnumerable)。 "

调用 object.hasOwnProperty() 到底有什么意义? property 具有任何值这一事实是否意味着它在 object 中?

因为,Alex S,对象的原型包含对象的附加属性,这些属性在技术上是对象的一部分。它们是从基础对象类继承的,但它们仍然是属性。 hasOwnProperty 只是检查这是否是特定于此类的属性,而不是从基类继承的属性。一个很好的解释:brianflove.com/2013/09/05/javascripts-hasownproperty-method

然而,我觉得我应该提到 Object.keys(obj) 现在是获取对象本身键的更好的解决方案。 Mozilla 文档链接:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

缺少一项重要信息。 property 在这里是一个字符串,应该叫 propertyName。否则会对像我这样的 JS 新手造成混淆,即在 if 中做什么。

答2:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

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

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 循环更好(并且更具可读性)。

它在这些浏览器上受支持:

火狐(壁虎):4(2.0)

铬:5

互联网浏览器:9

有关详细信息,请参阅 the Mozilla Developer Network Object.keys()'s reference。

现在得到更广泛的支持:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

如果您需要对旧浏览器的支持,您可以使用此polyfill

在支持此语言结构的环境中,此方法允许调用 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 });

@AJ_83 没有摆脱 forEach() 的好方法。在这种情况下使用 some() ,并返回 true 以中断

为什么这比 for-in 更具可读性? for candidate in candidateStatus... 对我来说似乎可读

答3:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

我们是 2019 年的女孩和男孩,我们没有那么多时间打字…所以让我们来做这个酷炫的新奇特 ECMAScript 2016:

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

这与 Danny R 的回答有何不同?

它是一个单行器,使用 map 而不是 forEach。对于某些人来说,console.log 语句也可能很有趣。

Satly,当 obj=window.performance.memory :-/ Where as for in 时,这不起作用。即var obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );

window.performance.memory 仅受 chrome 支持,Object.keys(obj) 返回一个空数组。这与 .map 无关。

万一有人不想在e 上重新构建这个单行程序以一次做不止一件事,我已经发布了这个要点。它基本上就像大多数哈希实现一样,使用 ( (key) => (value) ) 而不是 { key => value },但如果你还没有之前处理它,它可以帮助您更好地可视化它:gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8

答4:

huntsbot.com – 高效赚钱,自由工作

它是 for…in statement(MDN、ECMAScript spec)。

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

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

非常感谢,我现在明白了。我在敲我的头,浏览书籍和谷歌。

同意@RightSaidFred,in 运算符和 for 语句根本不涉及,for-in statement 代表自己的语法产生:for ( LeftHandSideExpression in Expression ),for ( var VariableDeclarationNoIn in Expression )

奇怪的是,这个答案有很多赞成票,特别是因为这些受欢迎的评论似乎与它相矛盾。

为什么这被标记为答案?这很可能是这个线程中最没有帮助的一个..

最没有帮助的答案?取决于您认为OP在问什么;当我第一次阅读这个问题时,它似乎对变量可用于检查对象属性的机制感到困惑困惑,并且这个答案雄辩地解释了这一点(尽管有“for-in”用词不当)。我看到的“为什么它会提供每个属性”的问题可能暗示 OP 正在寻找 hasOwnProperty 但不知道,但我认为这更有可能是 OP 想知道的,并且错误地接受了正确的回答一个不同的问题。 :-)

答5:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

在 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 => ...)

这将是最好的解决方案(object.entries ...),但我不能使用它。当您想多次执行此操作并且在您的框架中无法支持时,您可以使用此页面上的 polyfill:developer.mozilla.org/nl/docs/Web/JavaScript/Reference/…

如果您只有属性的值,第三个建议很好。惊人的!

这是最佳答案,您应该使用 for (const [key, value] of Object.entries(obj)) { }

答6:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

这只是一个 for…in 循环。查看the documentation at Mozilla。

链接已损坏:(。

@Burak 感谢您让我知道 - 已修复。将来,请随时提出修改建议:)

答7:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

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.
// 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]);
    });
}

嗨,您能否添加有关您的答案的更多信息,仅提供代码无济于事。

嗨@Nicolas,我在代码中添加了逐行解释。如果还不清楚,请告诉我

因为forEach skips empty values,我认为您可以摆脱 if 并像 Frank Roth 的回答那样做 Object.keys(obj).forEach(e => console.log(key= e v a l u e = {e} value= evalue={obj[e]}));。

答8:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

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

如 Mozillas Object.entries() 文档所示:

Object.entries() 方法返回给定对象自己的可枚举属性 [key, value] 对的数组,其顺序与 for…in 循环提供的顺序相同(不同之处在于 for-in 循环枚举原型链中的属性)。

基本上使用 Object.entries,我们可以放弃旧的 for…in 循环所需的以下额外步骤:

// This step is not necessary with Object.entries
if (object.hasOwnProperty(property)) {
  // do stuff
}

答9:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

Dominik’s 答案是完美的,我只是更喜欢这样做,因为它更易于阅读:

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

    // Do stuff...
}

应该是 Object 和大写的 o,不是吗?

@Jonathan 注意它是第一行中的 object 变量。

我已经更新了代码以避免混淆;)

答10:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

jquery 允许你现在这样做:

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

$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)}) $.each 是对象的 not suitable。如果一个对象恰好有一个长度属性并且它的值恰好为零,则整个对象被视为一个空数组。

Details 为什么我认为这是一种招致错误的方法。

答11:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

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

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

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

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

您可以看到变量与变量的值有何不同。相反,for…of 循环则相反。

我希望这有帮助。

原文链接:https://www.huntsbot.com/qa/7Q7e/iterate-through-object-properties?lang=zh_CN&from=csdn

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值