19812
javascriptのpushで配列の最後にpushで値を追加する方法について理解できなくて詰まっています。  
以下のような、shop に紐付いた list があり、list に紐付いた item が存在する構造が前提のとき、  
n番目の list の item に $scope.newItem を追加するにはどうすればよいでしょうか。

こちらのコードのようにしますと、$scope.shop.lists[0].items は配列ではないので  
"TypeError: Cannot read property 'push' of undefined" とエラーになってしまします。。  
(なぜかエラーにならないときもたまにあるようです...)

```

    $scope.newItem = { title: 'title', shop_id: '1', list_id: '1' }
    $scope.shop.lists[0].items.push($scope.newItem)
    
```

初歩的な質問ですみません。  
よろしくお願いいたします。
CC BY-SA 3.0
2015-12-09T09:43:21.857
19805
2015-12-10T02:22:19.187
10441
question
javascript
javascriptのpushで配列の最後にpushで値を追加する方法について
配列以外には`push`できません。

> こちらのコードのようにしますと、$scope.shop.lists[0].items は配列ではないので "TypeError:  
>  Cannot read property 'push' of undefined" とエラーになってしまします。。

一応以下のようにすれば動くと思いますが。。。

```

    $scope.shop.lists[0].items = [];
    $scope.newItem = { title: 'title', shop_id: '1', list_id: '1' }
    $scope.shop.lists[0].items.push($scope.newItem)
    
```
CC BY-SA 3.0
2015-12-09T11:00:01.240
19812
2015-12-09T11:00:01.240
13493
19805
answer
これ、配列型(Array)ではなくオブジェクト型(Object)です。

一応拡張すれば動作はしますがお勧めしません。  
配列と違い添え字をダイレクトに指定できるので値を上書きしてしまう可能性があります。  
また、それぞれの宣言の方法も記載しておきます。  
一度、型について調べてみてはいかがでしょうか？

```

    //Object型を拡張して"push"関数を追加：非推奨
    Object.prototype.push = function(v){
      var l = Object.keys(this).length;
      this[l]=v;
    };
    
    //Arrayの宣言
    var arr = new Array();
    arr = [];
    //Objectの宣言
    var obj = new Object();
    obj = {};
    
    obj.push("test");
    
    document.getElementById("console").innerHTML = "JSON : "+JSON.stringify(obj);
```

```

    <div id="console"></div>
```
CC BY-SA 3.0
2015-12-10T02:22:19.187
19831
2015-12-10T02:22:19.187
19805
answer