javascript修改app状态对象数组

时间:2017-05-17 04:10:27

标签: javascript

我正在学习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;
&#13;
&#13;

代码在这里

2 个答案:

答案 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属性。

&#13;
&#13;
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;
&#13;
&#13;