2016-01-06 49 views
0

我正在完成一个freeCodeCamp exercise,我已经死了。使用javascript函数输入更改JSON对象值

该练习的目的是编写一个带有3个参数的函数(id, prop, value)。

经过一番评估(检查prop是否为空,检查prop是否为“tracks”),函数应该更改预定义的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

您codepen是不同的......在这你说'集合[ID] [道具] =道具;'... ...的两倍,而不是'集合[ID ] [prop] = value;'...并且在这段代码中,除了“tracks”之外,你设置了collection [id] [prop] =“”;' –

回答

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,它处理过的不同情况(proptracks与否,value加入第一轨正常

0

城是不是"",所以总共4例),你会发现你的逻辑是有缺陷的。在你当前的代码中,如果该值不是空的,你将用新值覆盖该属性,不管它是否为数组。

从描述中不清楚你实际上想要在所有4种情况下做什么(最特别是在value为空的情况下:它是否应该改写东西,什么也不做......?对于tracks数组或者不是?),所以很难推荐代码,但是如果你在所有四种情况下写下你想要的内容,那么编写适当的代码很容易。

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; 
} 
-2

有整体描述:

写函数,它接受一个专辑的ID(如2548),属性道具(如 “艺术家” 或“轨道“)和一个值(比如”爱上瘾“)来修改这个集合中的数据。

如果prop不是“音轨”且值不是空白,请更新或设置该唱片专辑属性的值。

您的函数必须始终返回整个集合对象。

有用于处理数据不完整几条规则:

如果道具是“轨道”,但专辑中没有一个“轨道”属性,添加新的价值,专辑中的相应属性之前创建一个空数组。

如果prop是“音轨”且值不是空白,请将该值压入专辑现有音轨数组的末尾。

如果值为空,请从相册中删除该属性。

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; 
}