我正在学习Javascript,正在编写我的第一个应用程序。我有一个应用程序状态,并且我遇到了mod函数的问题。我希望一个函数能够根据' drvName'更改我的对象数组中找到的任何键的值。要输入到函数中的键值和其他参数。但是,我在控制台中至少遇到了一个莫名其妙的错误。该函数将是console.log(' working')但之后会返回一个错误,说明'类型错误无法读取属性drvName of undefined'。甚至在我用对象更新状态之后。知道我可以做些什么来修复这个bug吗?如果之前已经提到它的主题,请提前感谢并原谅这篇文章 - 我发现没有类似的内容。
const appState = []
///////////////////////////////////////////////////////////////////////////
/////////////MOD FUNCTIONs////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
/////////////////////////CREATE DRIVER///////////////////////////////////
function createDriver(state, name, phone, scac, trkNum, trlNum, pic) {
return state.push({
drvName: name,
phone: phone,
SCAC: scac,
trkNum: trkNum,
trlNum: trlNum,
picture: pic
})
}
/////////////////////////CHANGE DRIVER INFO/////////////////////////////////
//////////////////////////THIS DOES NOT WORK////////////////////////////////
function chgInfo(state, name, modKey, newVal) {
for (let i = 0; i <= state.length; i++) {
console.log('working');
if (state[i].drvName == name) {
state[i].modKey = newVal;
}
}
}
&#13;
代码在这里
答案 0 :(得分:1)
我认为您的问题在于此代码:
for (let i = 0; i <= state.length; i++) {
您的情况应该是i < state.length
,而不是<=
。控制台会抱怨state [i]未定义,因为您当前正在遍历state.length + 1
元素,并且您尝试访问的最后一个元素不存在 - 因此未定义错误
编辑:
对于modkey问题,您需要使用state[i][modKey]
来访问所需的属性。原因是modKey
是一个字符串变量,当您需要根据字符串/字符串变量访问对象的属性时,需要使用[]
运算符。
例如:
var a = {"property1": 1};
var b = "property1"
console.log(a.b) // will throw up undefined
console.log(a[b]) // will log 1;
如果您使用.
运算符,javascript将尝试访问名为“b”的属性,该属性不存在。但是,如果您使用[]
,javascript将评估b的值并返回该值。
所以你应该:
if (state[i].drvName == name) {
state[i][modKey] = newVal;
}
答案 1 :(得分:0)
<=
导致代码尝试访问状态[1],即使您只调用createDriver
一次,这会导致您当前的错误。
我发现的另一个问题是你如何使用modKey
。我假设您正在尝试更新以modKey命名的属性,而不是实际设置modKey属性。在下面的更新代码中,它访问modKey
中存储的属性名称以更新值,而不是添加modKey
属性。
const appState = []
///////////////////////////////////////////////////////////////////////////
/////////////MOD FUNCTIONs////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
/////////////////////////CREATE DRIVER///////////////////////////////////
function createDriver(state, name, phone, scac, trkNum, trlNum, pic) {
return state.push({
drvName: name,
phone: phone,
SCAC: scac,
trkNum: trkNum,
trlNum: trlNum,
picture: pic
})
}
/////////////////////////CHANGE DRIVER INFO/////////////////////////////////
//////////////////////////THIS DOES NOT WORK////////////////////////////////
function chgInfo(state, name, modKey, newVal) {
for (let i = 0; i < state.length; i++) {
console.log("working");
if (state[i].drvName == name) {
state[i][modKey] = newVal;
}
}
}
createDriver(appState, "name", "phone", "scac", "trkNum", "trlNum", "pic");
chgInfo(appState, "name", "phone", "new phone");
document.write(JSON.stringify(appState));
&#13;