我有一个JavaScript对象,如下所示:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

我如何循环遍历p的所有元素(p1、p2、p3…)并获取它们的键和值?


当前回答

当对象实现.next()方法时,它将成为迭代器

常量james={name:“James”,高度:`5'10“`,重量:185,[符号迭代器](){让财产=[]for(let key of Object.keys(james)){财产推送(键);}索引=0;返回{下一个:()=>{let键=财产[索引];let value=this[key];让done=索引>=属性.length-1;索引++;返回{钥匙价值完成};}};}};constiterator=james[Symbol.iiterator]();console.log(迭代器.next().value);//'詹姆斯console.log(迭代器.next().value);//`5'10`console.log(迭代器.next().value);//185

其他回答

在ES6中,我们有众所周知的符号来公开一些以前的内部方法,您可以使用它来定义迭代器如何为这个对象工作:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3",
    *[Symbol.iterator]() {
        yield *Object.keys(this);
    }
};

[...p] //["p1", "p2", "p3"]

这将给出与用于…相同的结果。。。在es6循环中。

for(var key in p) {
    console.log(key);
}

但了解您现在使用es6的能力很重要!

考虑到ES6,我想添加自己的一勺糖,并提供另一种方法来迭代对象的财产。

由于纯JS对象不能立即迭代,因此我们无法使用。。用于迭代其内容的循环。但没有人能阻止我们使其可迭代。

让我们有书的对象。

let book = {
  title: "Amazing book",
  author: "Me",
  pages: 3
}

book[Symbol.iterator] = function(){

  let properties = Object.keys(this); // returns an array with property names
  let counter = 0;
  let isDone = false;

  let next = () => {
    if(counter >= properties.length){
      isDone = true;
    }
    return { done: isDone, value: this[properties[counter++]] }
  }

  return { next };
}

既然我们做到了,我们可以这样使用它:

for(let pValue of book){
  console.log(pValue);
}
------------------------
Amazing book
Me
3

或者如果你知道ES6发电机的功率,那么你当然可以让上面的代码更短。

book[Symbol.iterator] = function *(){

  let properties = Object.keys(this);
  for (let p of properties){
    yield this[p];
  }

}

当然,通过在原型级别上使Object可迭代,您可以对所有对象应用这样的行为。

Object.prototype[Symbol.iterator] = function() {...}

此外,符合可迭代协议的对象可以与新的ES2015特性扩展运算符一起使用,因此我们可以将对象属性值作为数组读取。

let pValues = [...book];
console.log(pValues);
-------------------------
["Amazing book", "Me", 3]

或者可以使用析构函数赋值:

let [title, , pages] = book; // notice that we can just skip unnecessary values
console.log(title);
console.log(pages);
------------------
Amazing book
3

您可以使用我上面提供的所有代码查看JSFiddle。

您可以使用for in循环,如其他人所示。然而,您还必须确保获得的密钥是对象的实际属性,而不是来自原型。

下面是片段:变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(p中的var键){if(p.hasOwnProperty(键)){console.log(键+“->”+p[key]);}}

对于具有Object.keys()选项的:

变量p={0:“值1”,“b”:“值2”,键:“value3”};for(Object.keys(p)的var键){console.log(key+“->”+p[key])}

请注意for-of而不是for-in的用法,如果不使用,它将在命名的财产上返回undefined,并且Object.keys()确保只使用对象自己的财产,而不使用整个prototype-chain财产

使用新的Object.entries()方法:

注意:Internet Explorer本机不支持此方法。您可以考虑将Polyfill用于较旧的浏览器。

const p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (const [key, value] of Object.entries(p)) {
  console.log(`${key}: ${value}`);
}

由于es2015越来越流行,我发布了这个答案,其中包括使用生成器和迭代器平滑地遍历[key,value]对。这在其他语言中是可能的,例如Ruby。

好的,这里有一个代码:

常量MyObject={“a”:“您好”,'b':'它',“c”:“我”,“d”:“你”,“e”:“正在查找”,“f”:“for”,[Symbol.iiterat]:函数*(){for(Object.keys(this)的常量i){产量[i,this[i];}}};for(MyObject的常量[k,v]){console.log(`这里是键${k},这里是值${v}`);}

关于如何使用迭代器和生成器的所有信息,您可以在开发者Mozilla页面上找到。

希望它帮助了某人。

编辑:

ES2017将包含Object.entries,这将使对象中的[key,value]对的迭代更加容易。现在已知,根据ts39阶段信息,它将成为标准的一部分。

我认为是时候更新我的答案了,让它变得比现在更新鲜。

常量MyObject={“a”:“您好”,'b':'它',“c”:“我”,“d”:“你”,“e”:“正在查找”,“f”:“for”,};for(Object.entries(MyObject)的常量[k,v]){console.log(`这里是键${k},这里是值${v}`);}

您可以在上找到有关用法的更多信息MDN页面

将对象传递给object.keys()。这将返回一个包含对象中所有键的数组。然后可以使用map循环遍历数组。使用obj[key],其中obj是对象,key是映射迭代中的当前值,可以获得该键/属性的值。

const obj = { name: "Jane", age: 50 };

Object.keys(obj).map( key => {
    console.log(key, obj[key]);
});