如何改善对象的迭代效果?

时间:2018-06-26 09:18:40

标签: javascript

我正在尝试将.json中的每个“百分比”值保存到数组中:

enter image description here

此代码目前正在运行:

let percentage = []
for(var key in res['data']){
    percentage.push(res['data'][key].percentage);
}

但是我觉得我可以改进它,只使用一行。我尝试像过去那样将值映射到变量:

let percentage = res['data'].map(res => res.percentage);

但是相反,我收到“ TypeError:res.data.map不是函数”错误。如何改善我的代码以将其仅映射到这样的一行?:

6 个答案:

答案 0 :(得分:4)

data对象,而不是数组,因此不能在其上调用map。但是,您可以改用Object.values

const res = {
  data: {
    0: {
      percentage: 8.1
    },
    1: {
      percentage: 47
    },
    2: {
      percentage: 87
    }
  }
};
const percentage = Object.values(res.data).map(({ percentage }) => percentage);
console.log(percentage);

答案 1 :(得分:2)

可以与Array一起使用的

map函数。由于您输入的是对象,因此请使用Object.values。 Object.values(res.data).map(({ percentage }) => percentage);

答案 2 :(得分:2)

一种简单快捷的方法是使用lodash库(使用npm来获取它)

其中将有一个_.map方法,您可以像这样直接使用

_.map(res.data, (obj) => obj.percentage)

这里很多人建议的另一种方法是,为什么要使用它:

1-这里的第一件事是for..in的使用,它也迭代对象的原型链属性。 在mozilla页面上:

  

Object.values()方法返回给定对象自己的数组   可枚举的属性值,其顺序与   for ... in循环(区别是for-in循环枚举   原型链中的属性)。

因此,您应该使用Object.values仅获取其自己的枚举。

2-一旦将值作为列表,就可以在其上运行地图功能。 在此,在传递给map的箭头函数中,执行对象解构{propertyName}(特定于ES6)以将属性提取到propertyName变量。

因此,代码将变为:

Object.values(res.data)
.map( ({percentage}) => percentage)

我希望这一切都可以清除。 EOD。

答案 3 :(得分:1)

data不是数组,因此不能在数组以外的对象上实现map()。您必须使用Object.values()来实现map()

let percentage = Object.values(res.data).map(res => res.percentage);

答案 4 :(得分:1)

您可以执行Object.values,然后在其上使用map

let resp = {

  "data": {
    "0": {
      "percentage": 8.1
    },
    "1": {
      "percentage": 9.1
    },
    "2": {
      "percentage": 10.1
    }
  }
}

let perc = Object.values(resp.data).map(function(item) {
  return item.percentage;
})
console.log(perc)

答案 5 :(得分:0)

res.data是一个对象,而不是数组,因此目前没有map方法可用。

由于您的data对象具有数字键,因此您可以使用Object.assign轻松地将其转换为数组,然后进行映射。您还可以使用destructuring来稍微缩短映射功能:

let percentage = Object.assign([], res.data).map(({percentage}) => percentage);