我正在尝试对对象常量构造函数内部的javascript数组使用动态更新的访问器。数据和索引变量都在相同的功能范围内。
var data = [];
var index = 0;
dateKeys.forEach(element=>{
data.push({"date":element,[otherKeys[0]]:currentAccount[index]["2017_Q1"],[otherKeys[1]]:0,[otherKeys[2]]:0,[otherKeys[3]]:0,[otherKeys[4]]:0,[otherKeys[5]]:0})
index = index +1;
})
上面的代码产生以下错误消息:TypeError:undefined不是对象(正在评估'currentAccount [index] [“ 2017_Q1”]')
当我尝试时:
dateKeys.forEach(element=>{
var index = 0;
data.push({"date":element,[otherKeys[0]]:currentAccount[index] ["2017_Q1"],[otherKeys[1]]:0,[otherKeys[2]]:0,[otherKeys[3]]:0,[otherKeys[4]]:0,[otherKeys[5]]:0})
index = index +1;
})
我获得了索引0的正确数据,但是它没有更新。为什么范围界定在这里似乎对使用变量名代替方括号中的数字的能力有所不同?我尝试使用let来查看它是否是一个有约束力的问题,但这没什么区别。有使用香草JavaScript的解决方案吗?
答案 0 :(得分:1)
这是因为每次调用index
回调时,您都在声明和初始化forEach
变量。
例如,如果dateKeys
有5个项目,则element => ...
将被调用5次,并且每次创建一个新变量index
并将其值设置为0。
在第二种情况下,您永远不会访问currentAccount
值为1的index
。
您收到此错误消息是因为dataKeys
的条目比currentAccount
多。
答案 1 :(得分:1)
var
是作用域的,这意味着您的index
会被吊到顶部并退出循环块。每次循环访问dataKeys
时,它将始终引用相同的提升的index
。
使用let
在index
内声明forEach
,或简单地从index
公开forEach
参数:
dateKeys.forEach((element, index) => {
// use index here
})
答案 2 :(得分:1)
问题是您每次循环运行时都声明index
-函数内部的代码将每次执行。您需要使用内置的forEach
索引参数(第二个):
dateKeys.forEach((element, index) => {
data.push({"date":element,[otherKeys[0]]:currentAccount[index] ["2017_Q1"],[otherKeys[1]]:0,[otherKeys[2]]:0,[otherKeys[3]]:0,[otherKeys[4]]:0,[otherKeys[5]]:0});
});