题目描述,给定一个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 updateRecords(id, prop, value) {
  return collection;
}
// Alter values below to test your code
updateRecords(5439, "artist", "ABBA");
要求是这样的:
For the given id in collection:
If value is non-blank (value !== “”) and prop is not “tracks” then update or set the value for the prop.
If the prop is “tracks” and value is non-blank, push the value onto the end of the tracks array.
If value is blank, delete that prop.
Always return the entire collection object.
我经过一番思考,写出的程序是这样的:
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(value!==""&& prop!=="tracks"){
  collection.id.prop=value;
 
}
  
  else if(prop=="tracks"&&value!==""){
    collection.id.tracks.push(value);
  }
  else if(value===""){
    collection.id.prop.delete();
  }
  return collection;
}
// Alter values below to test your code
updateRecords(5439, "artist", "ABBA");
出现的错误提示是:
	TypeError: Cannot set property ‘artist’ of undefined
个人其实在之前判断这个应该就是传递参数时遇到的问题,但是不知道怎么解决。在
	  collection.id.prop=value;
	
这一行代码修改了很多遍,也看过一些例程。比如修改成:
	
	collection.[id].[prop]=value
又或者是:
	
	collection.[“id”].prop=value
反正就是来回用[]试探了。 无效
最后还是用谷歌搜索了一下,得到了issues/5920
有个网友回答的很到位:
The problem is that id is not a property of collection. id is a variable that contains the name of a property of collection. You must use bracket notation to access it. IE collection[id]
所以我分析得多少还有几分道理,只是忘记了collection与[id] 之间是不能有符号. 的。这个时候使用[]也正是为了区分prop。
当然,我还发现了我的代码的其他问题,比如在一个array里面删除一个元素,可以用delete,但是我之前的用法:
collection.id.prop.delete();
显然是不对的,我是受到了上一个push命令的影响。实际上应该使用:
	
	delete collection[id][prop]
修改后的代码为:
// 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(value!==""&& prop!=="tracks"){
  collection[id][prop]=value;
 
}
  
  
  else if(prop=="tracks"&&value!==""){
    collection[id][prop].push(value);
  }
  else if(value===""){
   delete  collection[id][prop];
  }
  return collection;
}
// Alter values below to test your code
updateRecords(2548, "artist", "");