• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

5.8 Object.keys, values, entries

JS 教程 tiantian 344次浏览 0个评论 扫描二维码

让我们暂时先放下学习独立的数据结构,而是来讨论一下如何迭代它们。

在前面的章节中,我们学习过方法map.keys()map.values()map.entries()

那些方法都是通用的,所有遵从那个通用规则的数据结构都可以使用那些方法。如果我们创建了一个自己的数据结构,我们也应该在该数据结构上实现那些方法。

它们被以下的数据结构支持:

  • Map
  • Set
  • Array(除了arr.values())

普通对象同样支持那些类似的方法,但是语法有少些不同。

Object.keys,values,entries

对于普通对象,存在下列所示的方法:

但是,请注意它们的区别(此处以map作为示例):

Map Object
调用语法 map.keys() Object.keys(obj), 不是obj.keys()
返回值 可迭代对象 真正的数组

它们之间的第一个区别就是:我们必须使用Object.keys(obj) 来调用,而不是obj.keys()

为什么?这个主要的原因是灵活性。记住,对象是 JavaScript 中所有复杂数据结构的基础数据结构。所以,我们可能具有一个自己的对象,比如order,其实现了它自己的order.values()方法。但是,我们仍然可以在该对象上调用Object.values(order)方法。

它们之间的第二个区别在于:Object.*方法返回的是真正的数组对象,而不仅是一个可迭代对象。这主要是由历史原因造成的。

举个例子:

let user = {
  name: "John",
  age: 30
};
  • Object.keys(user) = [name, age]
  • Object.values(user) = ["John", 30]
  • Object.entries(user) = [ ["name", "John"], ["age", 30] ]

下面再看一个使用Object.values来循环迭代属性值的例子:

let user = {
  name: "John",
  age: 30
};

// loop over values
for (let value of Object.values(user)) {
  alert(value); // John, then 30
}

Object.keys/values/entries 忽悠 symbolic 属性

就像for..in循环,那些方法会忽略那些使用Symbol(...)作为键的属性。

一般地,这个特性是非常便利的。但是如果我们希望对象的 symbolic 键,那么就可以使用另一个方法:Object.getOwnProperySymbols,它会返回一个只包含对象所有 symbolic 键的数组。另外,方法 Reflect.ownKeys(obj)返回所有的键值。

任务


累加属性

假设存在一个salaries对象,其包括任意数量的工资数据。

创建一个函数sumSalaries(salaries),利用Object.valuesfor..of循环计算该对象所有工资的累加和并返回。

如果salaries为空,那么结果必须比0

举例:

let salaries = {
  "John": 100,
  "Pete": 300,
  "Mary": 250
};

alert( sumSalaries(salaries) ); // 650

属性计数

创建一个函数count(obj),功能是返回对象的属性的个数:

let user = {
  name: 'John',
  age: 30
};

alert( count(user) ); // 2

请尽量使得该代码更加简洁。

P.S. 请忽略 symbolic 属性,只计算普通的属性。


天天编码 , 版权所有丨本文标题:5.8 Object.keys, values, entries
转载请保留页面地址:http://www.tiantianbianma.com/object-keys-values-entries.html/
喜欢 (0)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址