【问题标题】:Editing an array inside an object inside an object在对象内编辑对象内的数组
【发布时间】:2016-06-04 02:52:39
【问题描述】:

我正在为一门编程课做一个挑战,但由于某种原因,我的代码无法运行。我得到了以下信息:

// 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

我应该满足以下条件:

  • updateRecords(5439, "artist", "ABBA") 后,artist 应该是 "ABBA"
  • 在 updateRecords(5439, "tracks", "Take a Chance on Me") 之后,曲目的最后一个元素应该是“Take a Chance on Me”。
  • updateRecords(2548, "artist", "") 后,不应设置艺术家
  • 在 updateRecords(1245, "tracks", "Addicted to Love") 之后,曲目的最后一个元素应该是“Addicted to Love”。
  • updateRecords(2548, "tracks", "") 后,不应设置轨道

我的代码仅满足第一个和第四个要求。运行updateRecords(5439, "tracks", "Take a Chance on Me"); 或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;
}

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    我们这里有两个错误。

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

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

    总体包括所有的整改,我们可以做以下功能

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

    【讨论】:

    • 我不知道您可以将逻辑 OR 与声明一起使用。这让它变得容易多了。非常感谢,您的代码有效!
    【解决方案2】:

    您发布了两个错误。

    1. 此错误来自您尝试在 collection[id].tracks 上调用 push。如果尚未在collection[id] 记录上设置tracks 属性,则它还不是Array,因此没有push 方法。在尝试对其进行push 之前,您必须检查Array 是否存在,或者您可以为每条记录的tracks 属性预先分配一个空的Array。

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

    【讨论】:

      【解决方案3】:

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

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

      delete collection.id.prop; 行中的错误TypeError: Cannor convert undefined or null to object 显示了类似的问题。您正在尝试访问任何元素中都不存在的名为“prop”的属性。因此,您需要在此处使用括号表示法。

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

      【讨论】:

      • 是的,我在发布后不久就发现了第一部分。现在我唯一的问题是如何创建具有 [value] 值的数组?
      • 我不明白你的问题:(
      • 我想创建数组并给它一个用户所说的值。我正在尝试做collection[id].tracks = [value];,它不再给出错误,但它不会向 JSON 树添加任何内容。
      • 如果具有该 id 的对象已经有一个 tracks 数组,它不会添加任何内容,它会用你说的任何内容替换它。但如果没有,那么我不明白为什么它不应该修改树..
      • 我试图简化代码。现在我在 OP 的编辑中有代码
      猜你喜欢
      • 2019-08-09
      • 1970-01-01
      • 2020-11-24
      • 2017-10-11
      • 1970-01-01
      • 2021-11-27
      • 2022-11-19
      • 1970-01-01
      • 2021-02-08
      相关资源
      最近更新 更多