如何迭代 JavaScript 中的对象

假设您有一个简单的 JavaScript 对象:

const obj = {
  name: Luke Skywalker,
  title: Jedi Knight,
  age: 23
};

你如何遍历键/值对并打印出 name: Luke Skywalker、title: Jedi Knight 和 age: 23?在现代 JavaScript 中有很多方法可以做到这一点。 这里有3种不同的方式:

使用 Object.entries()

Object.entries() 函数返回一个包含对象的键/值对的 arrau。 这是您如何使用打印出键/值对的方法 Object.entries() 和一个 for/of 循环

const obj = {
  name: Luke Skywalker,
  title: Jedi Knight,
  age: 23
};

// Prints out:
// name: Luke Skywalker
// title: Jedi Knight
// age: 23
for (const [key, value] of Object.entries(obj)) {
  console.log(`${key}: ${value}`);
}

在 JavaScript 中,一个 条目 是一个恰好有 2 个元素的数组,其中第一个元素是 key 第二个元素是 value,入口模式出现在 JavaScript Map 构造函数 Object.fromEntries()

如果将迭代器转换为 Object.entries() 使用返回到数组中 Array.from(),您将获得一个包含对象的键/值对的数组。

const obj = {
  name: Luke Skywalker,
  title: Jedi Knight,
  age: 23
};

const keyValuePairs = Object.entries(obj);
keyValuePairs[0]; // [name, Luke Skywalker]
keyValuePairs[1]; // [title, Jedi Knight]
keyValuePairs[2]; // [age, 23]

使用 Object.keys()

Object.keys() 函数返回对象键的数组,而不是键和值。 然后您可以使用方括号 [] 获取对象的值。

const obj = {
  name: Luke Skywalker,
  title: Jedi Knight,
  age: 23
};

// Prints out:
// name: Luke Skywalker
// title: Jedi Knight
// age: 23
for (const key of Object.keys(obj)) {
  console.log(`${key}: ${obj[key]}`);
}

为什么使用 Object.keys() 相对 Object.entries()?因为您无法更改条目中的值来更改对象中的值。

const obj = {
  name: Luke Skywalker,
  title: Jedi Knight,
  age: 23
};

// Assigning to `value` does **not** change the property
// value! You need to do `obj[key] = newValue`
for (let [key, value] of Object.entries(obj)) {
  if (key === title) {
    value = Jedi Master;
  }
}
obj.title; // Jedi Knight

// Works!
for (const key of Object.keys(obj)) {
  if (key === title) {
    obj[key] = Jedi Master;
  }
}

for/in

Object.keys()Object.entries() 函数只循环 对象自己的属性。对于 POJO ,这种区别并不重要。 但是当您使用 Promise ,这种区别可能很重要。用一个 for/in 循环允许您遍历对象的所有键,包括继承的键。

function JediKnight(name, age) {
  this.name = name;
  this.age = age;
}
// `title` is an inherited property for instances of the
// `Jedi Knight` class.
JediKnight.prototype.title = Jedi Knight;

const obj = new JediKnight(Luke Skywalker, 23);

// `entries` will **not** include the `title` property
const entries = Object.entries(obj);
entries; // [[name, Luke Skywalker], [age, 23]]

// Includes `title`, because `for/in` also loops over
// inheritted properties.
// name: Luke Skywalker
// age: 23
// title: Jedi Knight
for (const key in obj) {
  console.log(`${key}: ${obj[key]}`);
}

一般来说,你应该使用 Object.keys() 或者 Object.entries() 使用 POJO 以避免意外拾取继承的属性。但是你可以使用 for/in 如果您确定要遍历继承的属性。

© 版权声明
THE END
喜欢就支持一下吧
点赞568 分享
评论 抢沙发

请登录后发表评论