for循环在javascript中取对象属性的意思

时间:2017-11-19 13:57:12

标签: javascript arrays loops mapbox

我有一系列功能,我希望找到属性的平均值

var features = map.queryRenderedFeatures({ layers: ['my_layer']});
console.log(features)

返回:

(10) [Feature, Feature, Feature, Feature, Feature, Feature, Feature, Feature, Feature, Feature]
0:Feature
layer:{id: "my_layer", type: "circle", source: "tbr", filter: Array(3), layout: {…}, …}
properties:{bikeid: 15847, diff.time: 2.25, …}

但是,当我尝试获取每个要素的diff.time属性的总和和长度时,会返回带有意外标识符的语法错误。

var sum = 0 
var length = 0    

    for each (var feature in features) {
    sum += feature.properties['diff.time'];
    length ++

    }

    console.log(sum/length)


Uncaught SyntaxError: Unexpected identifier

这种语法如何不正确以及应该更改哪些内容以达到预期效果?

1 个答案:

答案 0 :(得分:3)

我可以看到您的代码有3个问题。

for each不是javascript中的有效循环,Array#forEach是阵列上的方法。

当你执行for in时,你应该迭代一个对象键,它仍然可以工作,但是你将遍历length属性,并且迭代数组时效率不高,所以在这种情况下你应该进行for循环并迭代你的数组索引。

最后一个问题是命名属性diff.time虽然它是合法的并不是命名属性的好方法,因为您将无法使用点运算符访问它。

var sum = 0
var length = 0

for(var i; i < features.length; i+=1) {
  sum += features[i].properties['diff.time']; // don't think diff.time will work
  length++
}

console.log(sum / length)

除此之外,javascript有更好的更明确的方法,可以使用Array#reduce将值数组更改为单个值。

&#13;
&#13;
class Feature {
  constructor(id) {
    this.id = id
    this.properties = {
      'diff.time': 2.25 // this is a not a good way to name a property
    }
  }
}

const features = [
  new Feature(1),
  new Feature(2),
  new Feature(3),
]

console.log(
  features.reduce((acc, x) => {
    return acc + x.properties['diff.time']
  }, 0)
)
&#13;
&#13;
&#13;