2017-01-18 7 views
0

私は2つの配列を作成しているデータがあります。Javascriptデータリストは空になっていますがコンソールにはエラーはありません

コンソールでエラーは表示されませんが、リストは両方とも空です。

chList=[]; 
thList=[]; 
thCount=[]; 

for (var i = 0; i < mydata.length; i++) { 

    var obj = mydata[i]; 

    var cl = obj.name; 

    if (obj.subcat != null) { 
     chList.push(cl); 
    } 

    if(obj.subcat) { 

     if (i < 10) { 

      var nme = obj.subcat.map(function(item){ 
       return item.name; 
       console.log(nme); 
      }); 

      thList = thList.concat(nme); 
      thCount.push(nme.length); 
     } 

    } 

} 

console.log(thList); 
console.log(thCount); 

問題は、このような空thListとthCountの両方が出てきているということです::[]

はどのようにすることができます。ここ

は、ここでデータ

mydata = { 
    "id": "661", 
    "name": "some name", 
    "description": "some desc", 
    "subcat": { 
     "662": { 
      "id": "662", 
      "name": "sub 1", 
      "translations": null 
     }, 
     "663": { 
      "id": "663", 
      "name": "sub 2", 
      "translations": null 
     } 
    }, 
    "image": null 
}; 

コードがあるあります私はこれを悟りますか?

+3

''未定義length'プロパティの値はあまりないだろうまでmydata'はとてもループ、配列ではありません。 – trincot

+1

mydataが配列ではありません。長さのプロパティを持たないオブジェクトです。 – Smiranin

+0

Yoyはvar length = Object.keys(mydata);を使用できます。そしてあなたはmydataの長さを取得します – Smiranin

答えて

1

をObject.keys使用しています。配列内に提示されたオブジェクトリテラルをmydataのようにラップすると、他の同様のオブジェクトが追加される可能性があります。

も配列ではないため、obj.subcat.mapは機能しません。代わりにmapObject.keys(obj.subcat)に適用し、取得したキーでobj.subcatにアクセスしてください。それが動作するこれら2回の調整で

// mydata is an array 
 
mydata = [{ 
 
    "id": "661", 
 
    "name": "some name", 
 
    "description": "some desc", 
 
    "subcat": { 
 
     "662": { 
 
      "id": "662", 
 
      "name": "sub 1", 
 
      "translations": null 
 
     }, 
 
     "663": { 
 
      "id": "663", 
 
      "name": "sub 2", 
 
      "translations": null 
 
     } 
 
    }, 
 
    "image": null 
 
}]; 
 

 
var chList=[]; 
 
var thList=[]; 
 
var thCount=[]; 
 

 
for (var i = 0; i < mydata.length; i++) { 
 
    var obj = mydata[i]; 
 
    var cl = obj.name; 
 
    if (obj.subcat != null) { 
 
     chList.push(cl); 
 
    } 
 
    if(obj.subcat) { 
 
     if (i < 10) { 
 
      // You cannot use map on an object directly. Use Object.keys: 
 
      var nme = Object.keys(obj.subcat).map(function(key){ 
 
       var item = obj.subcat[key]; // get the item by key 
 
       return item.name; 
 
       // NB: console.log after `return` does not get executed! 
 
      }); 
 
      thList = thList.concat(nme); 
 
      // cf. Follow-up question: repeat length as many times: 
 
      thCount = thCount.concat(Array(nme.length).fill(nme.length)); 
 
     } 
 
    } 
 
} 
 

 
console.log(thList); 
 
console.log(thCount);

+0

これはほぼ完璧です。私はthCountが毎回カウントされる必要があるので、各サブについてカウントが必要です。この例では、それはサブ1、サブ2、次に2,2 ...となります。基本的にカウントの数はリストと一致する必要があります。この場合、同じカウントで2回カウントします。 – kevinj2017

+0

これは本当に別の質問ですが、OK、それを実現するコードを更新しました。 – trincot

1

mydata.lengthは、オブジェクトmyDataに存在しないlengthプロパティにアクセスしようとすると、未定義です。ループの反復はうまくいかないので、配列thList , thCountは常に空です。

あなたは、そのオブジェクトの一部ではない任意のプロパティにアクセスしようとすると、lengthプロパティは、あなたができる、オブジェクトのプロパティを取得しようとしている場合undefined

を返すjavascriptのは、JavaScriptのArray上に存在し、 mydataが配列でないとしても、var obj = mydata[i];のような声明があなたのケースでは動作しません

for (var property in mydata) { 
    if (mydata.hasOwnProperty(property)) { 
     // Rest of your statements 
    } 
} 

のように列挙のプロパティを反復処理してみてください。 mydataを配列として定義すると、var obj = mydata[i];ステートメントが機能します。

+0

私はコードのどの部分がまだ機能し、私は交換する必要があるの混乱しています:o/ – kevinj2017

+0

達成しようとしているものは何ですか?変数名は、このコードから必要とされるものを明確に表現するのに十分な記述ではありません。 – Agalo

0

このようなことを試してください。

for (var key in yourobject) { 
    // and access your data like this 
    yourobject[key].whatever 
} 
1

あなたがMYDATAの長さを取得したい場合、あなたはmydataは、オブジェクトの配列ではなく、あなたが提示一つだけであることを期待ように見え法

var length = Object.keys(mydata); 
関連する問題