使用javascript函数输入更改JSON对象值

时间:2016-01-06 12:12:38

标签: javascript

我正在完成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代码相同的代码。

6 个答案:

答案 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)

介绍不同的案例(proptracks还是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,在将新值添加到相册的相应属性之前创建一个空数组。

如果道具是"追踪"并且值不是空白,将值推到专辑现有曲目阵列的末尾。

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