无法将值推送到Object Array?

时间:2017-04-10 21:57:19

标签: javascript

所以我在FreeCodeCamp上有一些代码: https://jsfiddle.net/matt40413/m8wh7sxz/

在尝试将值推送到新数组(尚未存在)之前,一切都运行良好我收到错误Uncaught TypeError: collectionCopy[id].tracks.push is not a function

  if(prop == "tracks")
  {
    collectionCopy[id]["tracks"].push(value);
  }

这是它失败的地方。但有趣的是,如果我手动将所有内容放在如下:collectionCopy[5439]["tracks"].push("Whatever")就可以了!

那么这里发生了什么?我基本上做同样的事情?但只是使用参数(我的其他功能正常工作,所以我有点困惑)。

6 个答案:

答案 0 :(得分:1)

关于代码的三条评论:

  1. 您使用 if-else 语句作为单独的案例,这不是真的!为了分隔每个案例,您应该使用 else if statement

  2. 代码中的问题是您的第一个案例是

    如果(!collectionCopy [ID] [[丙]])

  3. 这就是说:如果 collectionCopy [id] 中的密钥 [prop] 不存在,那么......

    由于 [prop] 是一个数组,而不是一个字符串,因此表达式始终为true。因此,它正在执行 collectionCopy [id] [prop] = value

    注意:键总是字符串或数字。

    1. 其余的代码是正确的,实际上很酷。
    2. 这是经过纠正的摘录。

      // 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(!collectionCopy[id][prop])
        {
        collectionCopy[id][prop] = value;
        }
        else if(value == "")
        {
        console.log("DELETED");
          delete collectionCopy[id][prop.push]
        }
        else if(prop == "tracks")
        {
          collectionCopy[id]["tracks"].push(value);
        }
          console.log(collectionCopy);
      
      
      
      
      
        return collection;
      }
      
      // Alter values below to test your code
      updateRecords(5439, "tracks", "Take a Chance on Me");
      

      工作示例https://jsfiddle.net/m8wh7sxz/2/

答案 1 :(得分:0)

更改此部分:

collectionCopy[id]["tracks"].push(value);

要:

collectionCopy[id]["tracks"] = value;

由于collectionCopy[id]["tracks"]尚未初始化,因此您无法调用push()函数

答案 2 :(得分:0)

您只是错误地初始化了对象,这样做会解决它:

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

现在你的推送将附加到这个数组!在您尝试在字符串上运行 .push() 之前!

编辑:

如果需要在更新时动态构造数组,可以执行以下操作:

if (prop == "tracks") {
  console.log(collectionCopy[id]["tracks"])
  if (!(collectionCopy[id]["tracks"] instanceof Array)) {
    collectionCopy[id]["tracks"] = [value]
  } else collectionCopy[id]["tracks"].push(value)
}

答案 3 :(得分:0)

“5439”对象中没有“曲目”。

如果要将其作为数组访问,则应添加它。

"5439": {
  "album": "ABBA Gold",
  "tracks":[]
}

编辑:

这应该适合你。

else if(prop == "tracks")
{
   if(!("tracks" in collectionCopy[id]) ||  !(collectionCopy[id]
     ["tracks"].constructor === Array)){
       collectionCopy[id]["tracks"]=[];
   }
   collectionCopy[id]["tracks"].push(value);      

}

答案 4 :(得分:0)

if(prop == "tracks")
  {
    if(!Array.isArray(collectionCopy[id]["tracks"]){
      collectionCopy[id]["tracks"] = [];
    }
    collectionCopy[id]["tracks"].push(value);
  }

如果数组不是数组,则创建一个数组

答案 5 :(得分:-1)

如果尚未初始化数组属性,则无法将其推送到数组属性。您可以使用以下技巧:

if(prop == "tracks")
{
  (collectionCopy[id]["tracks"] = collectionCopy[id]["tracks"] || []).push(value);
}

如果阵列已初始化,则collectionCopy[id]["tracks"] || []将评估为collectionCopy[id]["tracks"] || [],否则将评估为[],从而初始化array类型的新属性。