我正在完成freeCodeCamp exercise并且我已经走到了尽头。
练习的目的是编写一个带有3个参数的函数(id, prop, value
)。
经过一些评估(检查prop是否为空白,检查prop是否为" track"),该函数应该更改预定义的JSON对象(记录集合)。
运行我的代码,我得到一些好奇的结果。错误的JSON属性会更新,或者根本不会更新。我怀疑问题在于对象调用,但我无法弄清楚我做错了什么。任何帮助表示赞赏。
// 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 update(id, prop, value) {
if(value !== "") {
if(prop == "tracks") {
collection[id][prop].push(value);
}
else {
collection[id][prop] = "";
}
collection[id][prop] = value;
}
return collection;
}
// Alter values below to test your code
update(5439, "artist", "ABBA");
如果有人想要修补,我还创建了一个codepen代码相同的代码。
答案 0 :(得分:2)
你想要像
这样的东西function update(id, prop, value) {
if(value !== "") {
collection[id] = collection[id] || {}; // to create id if required
if(prop == "tracks") {
collection[id].tracks = collection[id].tracks || []; // create empty tracks array if required
collection[id].tracks.push(prop);
}
else {
collection[id][prop] = value;
}
}
return collection;
}
上面允许你创建一个新的id,它可以正确地添加FIRST轨道
答案 1 :(得分:0)
介绍不同的案例(prop
是tracks
还是value
是""
还是value
,所以总共4个案例,你会看到你的逻辑是有缺陷的。在当前代码中,如果值不为空,则将使用新值覆盖该属性,无论它是否为数组。
从你的描述中不清楚你在所有4个案例中你真正想要做什么(特别是在tracks
为空的情况下:它应该覆盖事物,什么都不做......?它应该是不同的是不是 var a = 42;
var b = "42";
console.log(a +++b); // "4242"
console.log(a);
console.log(b);
console.log('A is 43 now... so postfix on A, then + B');
数组?),因此很难建议代码,但如果你在所有四种情况下写下你想要的东西,那么编写适当的代码就很容易了。
答案 2 :(得分:0)
试试这段代码:
function update(id, prop, value) {
if(value !== "") {
collection[id] = collection[id] || {}; // to create id if required
if(prop == "tracks") {
collection[id].tracks = collection[id].tracks || []; // create empty tracks array if required
collection[id].tracks.push(prop);
} else {
collection[id][prop] = value;
} }else {
if (collection[id][prop].hasOwnProperty()) {
} else {
delete collection[id][prop];
}
}
return collection;
}
答案 3 :(得分:0)
我实际上遇到了同样的问题并且代码存在问题。它通过了大部分测试,但在没有曲目的情况下错误地尝试创建新属性。我得到了这个代码来代替:
function updateRecords(id, prop, value) {
if((value !== "") && (prop !== "tracks")) {
console.log("Updating or setting property: ", prop);
console.log("setting property to: ", value);
collection[id][prop] = value;
}
else if((value !== "") && (prop === "tracks")) {
collection[id].tracks = collection[id].tracks || [];
collection[id].tracks.push(value);
}
else if(value === "") {
delete collection[id][prop];
}
return collection;
}
答案 4 :(得分:0)
这有效
function updateRecords(id, prop, value) {
if(value == ""){
delete collection[id][prop];
}
else if(prop == "tracks" && collection[id][prop]!= undefined){
collection[id].tracks.push(value);
}
else if(prop != "tracks" && collection[id][prop]== undefined)
{
collection[id][prop] = value;
}else if(prop == "tracks" && collection[id][prop]== undefined)
{
collection[id]["tracks"] = [];
collection[id].tracks.push(value);
}
return collection;
}
答案 5 :(得分:-2)
有完整的描述:
编写一个功能,其中包含专辑的ID(如2548),属性道具(如"艺术家"或"曲目")和一个值(如& #34;沉迷于爱情")修改此集合中的数据。
如果道具不是"跟踪"并且值不是空白,更新或设置该记录专辑的属性值。
您的函数必须始终返回整个集合对象。
处理不完整数据有几条规则:
如果道具是"追踪"但这张专辑并没有“跟踪”#34; property,在将新值添加到相册的相应属性之前创建一个空数组。
如果道具是"追踪"并且值不是空白,将值推到专辑现有曲目阵列的末尾。
如果值为空,请从相册中删除该属性。