问:
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