2017-04-01 10 views
0

配列に日付が存在するかどうかを調べる際に問題が発生しています。JavaScriptループスルーして重複値を確認する

for(var i = 0; i< crisislist.length; i++){ 
     hazecounter = 1; 
     if(crisislist[i].category == 1){ 
      if(crisislist[i].date != crisislist[i+1].date) { 
       hazelabel.push(crisislist[i].date); 
      }else{ 
       hazecounter++; 
      } 
      hazedata.push(hazecounter); 
     } 
} 

日付のサンプルデータは、次のとおりです。

["01-02-2017", "22-03-2017", "22-03-2017", "07-08-2017"] 

そしてhazelabelの予想出力、hazedataは次のようになります。

hazelabel:[ "2017年1月2日"、「22 "-03-2017"、 "07-08-2017"] hazedata:[1,2,1]

上記のコードでは、配列の最後の要素までチェックして比較しようとすると、それは私にエラーメッセージをスローするセージ:

Uncaught TypeError: Cannot read property 'date' of undefined 

私は配列の最後の要素に達し、そして私は、[I + 1] .dateをcrisislistを見つけるしようとすると、それが見つかったため、エラーメッセージが表示されなかったため、これがあると思います。

これを修正する方法はありますか?前もって感謝します!

+0

私はそれを得る、より多くのコードを必要としません。 – aeid

+0

'date'プロパティにアクセスする前に' crisislist [i] + 1'が 'undefined'でないかどうかチェックできませんか? – Teemoh

+0

このように簡単に書くことができますhttp://stackoverflow.com/questions/40418507/javascript-filter-array-with-duplicate-dates jsfiddle demo https://jsfiddle.net/u6u80zsa/ – Sankara

答えて

1

を行くためのループのためにあなたはiは最後の要素を指していないだけでcrisislist[i+1].dateにアクセスする必要があります変更してみてください。

希望の結果を得るには、hazedata.pushをifブロック内に移動し、ループの先頭にhazecounterの初期化を入れる必要があります。

var hazecounter = 1; 
for (var i = 0; i< crisislist.length; i++) { 
    if (crisislist[i].category == 1) { 
     if (i == crisislist.length-1 || crisislist[i].date != crisislist[i+1].date) { 
      hazelabel.push(crisislist[i].date); 
      hazedata.push(hazecounter); 
      hazeCounter = 1; 
     } else { 
      hazecounter++; 
     } 
    } 
} 
+0

ありがとうございます!私は最後の要素をチェックする方法を考えていました。 – guest176969

0

あなただけの二最後までチェックする必要があります。

for(var i = 0; i< (crisislist.length-1); i++){ 
     hazecounter = 1; 
     if(crisislist[i].category == 1){ 
      if(crisislist[i].date != crisislist[i+1].date) { 
       hazelabel.push(crisislist[i].date); 
       if (crisislist.length-2 == i) 
       { 
        hazelabel.push(crisislist[i+1].date); 
       } 
      }else{ 
       hazecounter++; 
      } 
      hazedata.push(hazecounter); 
     } 
} 
+0

しかし、それは最後のものを無視するだろうか? – Bergi

+0

ちょうどそれを試してみてくださいそれは2番目の最後と比較されるので、それは –

+0

と比較されますが、最後の項目は別々に見ていません。 – Bergi

0

あなたの文は問題になるだろうされている場合。

if(crisislist[i].date != crisislist[i+1].date) { 

あなたは< crisislist.lengthに行くループ内の[I + 1] crisislistにアクセスしています。つまり、サイズが4の配列がある場合、ループはi = 3になるが、配列(crisislist [4])からi + 1にアクセスしています。これは未定義です。

はあなたのcrisis.length-1する

0

コードを確認してください。ご質問がある場合は、コメントを追加してください:)私のソリューションの日付でソートする必要はありません。

</head> 

<BODY> 
<script> 

function Something(date) 
{ 
    this.date = date; 
    this.category = 1; 
} 

var crisislist = []; 
var hazelabel = []; 
var hazedata = []; 
crisislist[0] = new Something("01-02-2017"); 
crisislist[1] = new Something("22-03-2017"); 
crisislist[2] = new Something("22-03-2017"); 
crisislist[3] = new Something("07-08-2017"); 




for(var i = 0; i< crisislist.length; i++){ 
    if(crisislist[i].category == 1) 
    { 
    if(!hazelabel[crisislist[i].date]) 
    { 
     hazelabel[crisislist[i].date] = crisislist[i].date; 
     hazedata[crisislist[i].date] = 1; 
    } 
    else 
    { 
     hazedata[crisislist[i].date]++; 
    } 
    } 
} 

for(var key in hazelabel) 
{ 
console.log(hazelabel[key]); 
console.log(hazedata[key]); 
} 

</script> 
</BODY> 
</HTML> 
関連する問題