编辑对象内对象内的数组

时间:2016-06-04 02:52:40

标签: javascript arrays

我正在为编码类挑战,出于某种原因,我的代码无效。我得到了以下内容:

updateRecords(5439, "tracks", "Take a Chance on Me");

我原本应该完成以下任务:

  • 在updateRecords(5439,“艺术家”,“ABBA”)之后,艺术家应该是“ABBA”
  • 在updateRecords(5439,“追踪”,“抓住我的机会”)之后,曲目应该以“抓住我的机会”作为最后一个元素。
  • 在updateRecords(2548,“艺术家”,“”)之后,不应设置艺术家
  • 在updateRecords(1245,“追踪”,“沉迷于爱情”)之后,曲目应该是“沉迷于爱”作为最后一个元素。
  • 在updateRecords(2548,“track”,“”)之后,不应设置曲目

我的代码只满足第一和第四个要求。运行updateRecords(2548, "tracks", "");TypeError: Cannot read property 'push' of undefined时,我会获得updateRecords(2548, "artist", "");。当我运行TypeError: Cannor convert undefined or null to object时,我得到// Only change code below this line function updateRecords(id, prop, value) { if (value !== "" && prop !== "tracks"){ collection[id][prop] = value; } else if (value !== "" && prop == "tracks"){ var currentAlbumTracks = collection[id].tracks; currentAlbumTracks.push(value); } else if (value === ""){ delete collection.id.prop; } return collection; }

我的代码如下所示:

function updateRecords(id, prop, value) {
  var currentAlbumTracks = collection[id].tracks;
  if (value !== "") {
    if (prop !== "tracks"){
      collection[id][prop] = value;
    }
    else if (prop == "tracks"){
      if (currentAlbumTracks) {
       currentAlbumTracks.push(value);
      }
      else if (currentAlbumTracks === ""){
        collection[id].tracks = [value];
      }
    }
  }

  return collection;
}

知道发生了什么事吗?

编辑: 我已经改变了我的代码。现在我有:

fileB

3 个答案:

答案 0 :(得分:0)

您发布了两个错误。

  1. 此错误来自您尝试在push上致电collection[id].tracks。如果尚未在tracks记录中设置collection[id]属性,则该属性尚不是Array,因此没有push方法。在尝试Array之前,您必须检查push是否存在,或者您可以为每条记录预先为Array属性预分配tracks。< / p>

  2. 第二个错误可能是在引用属性时从括号表示法切换到点表示法的结果;您引用collection.id.prop,而在之前的所有情况下,您都引用collection[id][prop]

答案 1 :(得分:0)

TypeError: Cannot read property 'push' of undefined中的错误currentAlbumTracks.push(value);表示currentAlbumTracks未定义。你需要防范这种可能性:

var currentAlbumTracks = collection[id].tracks;
if (currentAlbumTracks) {
   currentAlbumTracks.push(value);
}

TypeError: Cannor convert undefined or null to object中的错误delete collection.id.prop;显示了类似的问题。您正试图访问名为&#39; prop&#39;在任何元素中都不存在。所以你想要括号表示法。

if (collection.id[prop]) {
   delete collection.id[prop];
}

答案 2 :(得分:0)

我们在这里有两个错误。

    在某些情况下,
  1. collection[id].tracksundefined,所以在推送值之前,您需要定义它,所以

    var currentAlbumTracks = collection[id].tracks;
    currentAlbumTracks.push(value);
    

    成了

    collection[id].tracks = collection[id].tracks || []; //Take existing or create new
    collection[id].tracks.push(value);
    
  2. 您的点符号不正确,更多信息here

    所以

    delete collection.id.prop;
    

    变为

    delete collection[id][prop];
    
  3. 总体而言包括所有整改,我们可以做出以下功能

    function updateRecords(id, prop, value) {
      if (value !== "" && prop !== "tracks"){
        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;
    }