2016-01-06 107 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; 
}