变量obj={name:“西蒙”,年龄:“20”,服装:{style:“简单”,嬉皮士:假}}for(obj中的var propt){console.log(propt+':'+obj[propt]);}

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


当前回答

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

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

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

Object.entries()方法返回给定对象自身的数组可枚举属性[key,value]对,顺序与由…提供。。。in循环(区别在于for in循环还列举了原型链中的财产)。

基本上,使用Object.entries,我们可以放弃旧的for。。。循环中:

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

其他回答

虽然最高评级的答案是正确的,但这里有一个备用用例,即如果您正在迭代一个对象,并希望最终创建一个数组。使用.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]
})

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

var o={a:1,b:2,c:3},a=[];o[Symbol.iiterator]=函数*(){var ok=对象.keys(this);i=0;而(i<ok长度)产生这个[ok[i++]];};for(o的var值)console.log(value);//或者你甚至可以这样做a=[…o];控制台日志(a);

实现这一点的简单明了的方法,即不迭代原型的现代JS,如下所示:

Object.prototype.iterateProperties = ((callback) => {
   Object.keys(obj).filter(key => obj.hasOwnProperty(key)).forEach((key) => {
      callback(key, obj[key]);
   });
});

解释

这段代码在所有对象的原型中创建了一个可以在每个object实例中访问的函数。该函数迭代对象的所有自己的财产,并运行回调函数,该函数为对象中的每个属性获取(键、值)。

使用示例

obj.iterateProperties((key, value) => console.log(key + ': ' + value));

还添加了递归方式:

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"} }); 
Object.keys(obj).forEach(key =>
  console.log(`key=${key} value=${obj[key]}`)
);