var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
变量如何propt
表示对象的属性?它不是内置方法或属性。为什么它包含对象中的每个属性?
var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
变量如何propt
表示对象的属性?它不是内置方法或属性。为什么它包含对象中的每个属性?
Answers:
遍历属性需要以下附加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
object.hasOwnProperty()
?property
具有任何价值的事实是否暗示着它的存在object
?
property
是一个字符串,应调用propertyName
。否则可能会使像我这样的JS新手感到困惑,即在里面做什么if
。
从JavaScript 1.8.5开始,您可以Object.keys(obj)
用来获取在对象本身上定义的属性数组(为返回true的属性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循环更好(更易读)。
这些浏览器支持它:
有关更多信息,请参见Mozilla开发人员网络Object.keys()的参考。
Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
for candidate in candidateStatus
...对我来说似乎可读
我们现在处于2019年的男女生中,我们没有太多的时间来打字...所以,让我们来做一下这个酷炫的新奇ECMAScript 2016:
Object.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
obj=window.performance.memory
:-/在哪里时,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
这是for...in statement
(MDN,ECMAScript spec)。
你可以把它读作“ FOR每个属性IN的obj
对象,每个属性分配给PROPT依次变量”。
在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 => ...)
这只是一个for...in
循环。查看Mozilla上的文档。
如果您的环境支持ES2017,那么我建议使用Object.entries:
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`);
});
如Mozillas Object.entries()文档所示:
所述Object.entries()方法返回在给定对象的自己的可枚举的属性[键,值]对的数组,在相同的顺序,通过提供一种用于... in循环(不同之处在于一个用于-in循环枚举原型链中的属性)。
基本上使用Object.entries,我们可以放弃旧的for ... in循环所需的以下额外步骤:
// This step is not necessary with Object.entries
if (object.hasOwnProperty(property)) {
// do stuff
}
上面的答案有点烦人,因为在您确定它是一个对象之后,它们并没有解释您在for循环内所做的事情:您不会直接访问它!实际上,您仅交付了需要应用于OBJ的密钥:
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安全的。甚至可以在像Rhino这样the脚的JS版本中工作;)
添加ES2015的用法,Reflect.ownKeys(obj)
并通过迭代器对属性进行迭代。
例如:
let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } };
可以被迭代
// logs each key
Reflect.ownKeys(obj).forEach(key => console.log(key));
如果您想直接遍历对象键的值,则可以定义一个 iterator
,就像JavaScipts的字符串,数组,类型数组,Map和Set的默认迭代器一样。
JS将尝试通过默认的迭代器属性进行迭代,该属性必须定义为Symbol.iterator
。
如果您希望能够遍历所有对象,则可以将其添加为Object的原型:
Object.prototype[Symbol.iterator] = function*() {
for(p of Reflect.ownKeys(this)){ yield this[p]; }
}
这将使您能够使用for ... of循环遍历对象的值,例如:
for(val of obj) { console.log('Value is:' + val ) }
注意:截至撰写此答案(2018年6月)时,所有其他浏览器均支持此功能,但IE支持for...of
通过以下方式生成器和进行迭代Symbol.iterator
if(Object.keys(obj).length) {
Object.keys(obj).forEach(key => {
console.log("\n" + key + ": " + obj[key]);
});
}
// *** Explanation line by line ***
// Explaining the bellow line
// It checks if obj has at least one property. Here is how:
// Object.keys(obj) will return an array with all keys in obj
// If there is no keys in obj, it will return empty array = []
// Then it will get it's length, if it has at least one element,
// it's bigger than 0 which evaluates to true and the bellow
// code will be executed.
// Else means it's length = 0 which evaluates to false
// NOTE: you can use Object.hasOwnProperty() instead of Object.keys(obj).length
if(Object.keys(obj).length) {
// 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]);
});
}
forEach
跳过空值,所以我认为您可以摆脱if,而只需执行Object.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
Frank Roth的答案即可。
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循环则相反。
我希望这有帮助。
您可以使用Lodash。该文件
var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
...
});
JavaScript中的对象是属性的集合,因此可以在每个语句的a中循环。
您应该将其obj
视为键值集合。
现在,您只需添加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);
function*
发现!
虽然最受好评的答案是正确的,但这是一个替代用例,即如果您要遍历一个对象并想最后创建一个数组。使用.map
代替forEach
const newObj = Object.keys(obj).map(el => {
//ell will hold keys
// Getting the value of the keys should be as simple as obj[el]
})
还添加了递归方法:
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"} });
for..in循环的作用是创建一个新变量(var someVariable),然后将给定对象的每个属性一一存储在此新变量(someVariable)中。因此,如果使用块{},则可以进行迭代。考虑以下示例。
var obj = {
name:'raman',
hobby:'coding',
planet:'earth'
};
for(var someVariable in obj) {
//do nothing..
}
console.log(someVariable); // outputs planet
obj[someVariable]
。它之所以被否决,可能是因为它不是递归的。因此,如果您具有高度结构化的对象,这将不是一个适当的解决方案。
在这里,我迭代每个节点并创建有意义的节点名称。如果您注意到,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的回答的启发。但是此解决方案具有更好的性能和更少的歧义
您基本上想遍历对象中的每个属性。
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);
obj(prop)
<
hasOwnProperty
属性。现在应该可以工作了。
我想补充上面的答案,因为您可能与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]);
}
}
遍历and 和of 的属性时0
,您可能会惊讶地看到控制台日志记录1
等。prop1
prop2
prop3_1
。这些对象是序列,序列的索引是Javascript中该对象的属性。
递归遍历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]);
}
}
}
选中此链接将对https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_state_forin有帮助
var person = {fname:"John", lname:"Doe", age:25};
var text = "";
var x;
for (x in person) {
text += person[x] + " "; // where x will be fname,lname,age
}
Console.log(text);
if (typeof(obj[propt]) === 'object') {
/ *再做一次* /}