FreeCodeCamp:记录集合返回“无法读取未定义的属性'push'”

时间:2019-06-30 08:00:23

标签: javascript arrays

挑战是Freecodecamp的“基本JavaScript:记录收集”。挑战在于更新JSON格式的Record Collection。

这是我编写的代码:

var collection = {
  "2548": {
    "album": "Slippery When Wet",
    "artist": "Bon Jovi",
    "tracks": [
      "Let It Rock",
      "You Give Love a Bad Name"
    ]
  },
  "2468": {
    "album": "1999",
    "artist": "Prince",
    "tracks": [
      "1999",
      "Little Red Corvette"
    ]
  },
  "1245": {
    "artist": "Robert Palmer",
    "tracks": []
  },
  "5439": {
    "album": "ABBA Gold"
  }
};
// Keep a copy of the collection for tests
var collectionCopy = JSON.parse(JSON.stringify(collection));


// Only change code below this line
function updateRecords(id, prop, value) {
  if (prop !== "tracks" && value !== "") {
    collection[id][prop] = value;
  } else if (prop === "tracks" && value !== "") {
    collection[id][prop].push(value);
  } else if (value == "") {
    delete collection[id][prop];
  } else if (prop === "tracks") {
    collection[id][prop] = [value];
  }


  return collection;
}

// Alter values below to test your code
updateRecords(5439, "artist", "ABBA");

除一项要求外,它满足所有要求:

  

updateRecords(5439,“ tracks”,“ Take a Chance on Me”)之后,曲目   最后一个元素应该是“在我身上有个机会”。

当我检查控制台时,我得到了以下语句

  

无法读取未定义的属性“ push”

似乎代码认为push(应该是一个函数)实际上是一个对象属性。

我该如何解决?

如果您想详细了解有关此挑战的更多信息,请访问以下链接: https://guide.freecodecamp.org/certifications/javascript-algorithms-and-data-structures/basic-javascript/record-collection/

1 个答案:

答案 0 :(得分:2)

当前,您的代码将永远不会达到else if (prop === "tracks")条件。如果为prop === "tracks",它将进入prop === "tracks" && value !== ""条件,并尝试将value推入tracks数组。如果tracks的{​​{1}}数组不存在(例如5439),它将引发错误。因此,您可以按以下方式更改条件

检查属性是否为id。在此tracks条件内,检查if是否有价值。如果是,请将其推入阵列。否则,添加一个像这样的新数组collection[id][prop]

[value]

这是一个有效的代码段:

function updateRecords(id, prop, value) {
  if (prop === "tracks" && value !== "") {

    // check if tracks exists
    if (collection[id][prop])
      collection[id][prop].push(value)
    else
      collection[id][prop] = [value]; // create a new array

  } else if (value != "") {
    collection[id][prop] = value;
  } else if (value == "") {
    delete collection[id][prop];
  }

  return collection;
}