所以我在FreeCodeCamp上有一些代码: https://jsfiddle.net/matt40413/m8wh7sxz/
在尝试将值推送到新数组(尚未存在)之前,一切都运行良好我收到错误Uncaught TypeError: collectionCopy[id].tracks.push is not a function
。
if(prop == "tracks")
{
collectionCopy[id]["tracks"].push(value);
}
这是它失败的地方。但有趣的是,如果我手动将所有内容放在如下:collectionCopy[5439]["tracks"].push("Whatever")
就可以了!
那么这里发生了什么?我基本上做同样的事情?但只是使用参数(我的其他功能正常工作,所以我有点困惑)。
答案 0 :(得分:1)
关于代码的三条评论:
您使用 if-else 语句作为单独的案例,这不是真的!为了分隔每个案例,您应该使用 else if statement
代码中的问题是您的第一个案例是
如果(!collectionCopy [ID] [[丙]])
这就是说:如果 collectionCopy [id] 中的密钥 [prop] 不存在,那么......
由于 [prop] 是一个数组,而不是一个字符串,因此表达式始终为true。因此,它正在执行 collectionCopy [id] [prop] = value 。
注意:键总是字符串或数字。
这是经过纠正的摘录。
// Setup
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(!collectionCopy[id][prop])
{
collectionCopy[id][prop] = value;
}
else if(value == "")
{
console.log("DELETED");
delete collectionCopy[id][prop.push]
}
else if(prop == "tracks")
{
collectionCopy[id]["tracks"].push(value);
}
console.log(collectionCopy);
return collection;
}
// Alter values below to test your code
updateRecords(5439, "tracks", "Take a Chance on Me");
答案 1 :(得分:0)
更改此部分:
collectionCopy[id]["tracks"].push(value);
要:
collectionCopy[id]["tracks"] = value;
由于collectionCopy[id]["tracks"]
尚未初始化,因此您无法调用push()
函数
答案 2 :(得分:0)
您只是错误地初始化了对象,这样做会解决它:
updateRecords(5439, "tracks", ["Take a Chance on Me"]);
现在你的推送将附加到这个数组!在您尝试在字符串上运行 .push()
之前!
如果需要在更新时动态构造数组,可以执行以下操作:
if (prop == "tracks") {
console.log(collectionCopy[id]["tracks"])
if (!(collectionCopy[id]["tracks"] instanceof Array)) {
collectionCopy[id]["tracks"] = [value]
} else collectionCopy[id]["tracks"].push(value)
}
答案 3 :(得分:0)
“5439”对象中没有“曲目”。
如果要将其作为数组访问,则应添加它。
"5439": {
"album": "ABBA Gold",
"tracks":[]
}
编辑:
这应该适合你。
else if(prop == "tracks")
{
if(!("tracks" in collectionCopy[id]) || !(collectionCopy[id]
["tracks"].constructor === Array)){
collectionCopy[id]["tracks"]=[];
}
collectionCopy[id]["tracks"].push(value);
}
答案 4 :(得分:0)
if(prop == "tracks")
{
if(!Array.isArray(collectionCopy[id]["tracks"]){
collectionCopy[id]["tracks"] = [];
}
collectionCopy[id]["tracks"].push(value);
}
如果数组不是数组,则创建一个数组
答案 5 :(得分:-1)
如果尚未初始化数组属性,则无法将其推送到数组属性。您可以使用以下技巧:
if(prop == "tracks")
{
(collectionCopy[id]["tracks"] = collectionCopy[id]["tracks"] || []).push(value);
}
如果阵列已初始化,则collectionCopy[id]["tracks"] || []
将评估为collectionCopy[id]["tracks"] || []
,否则将评估为[]
,从而初始化array
类型的新属性。