2016-03-29 6 views
0

私は2つの配列を比較しようとしています、そして、2つの与えられた配列のうちの1つに見つかった項目だけで新しい配列を返します。この未定義の値はどこから得られますか?

[1,2,3,4][1,2,3]の比較結果は、[4]である必要があります。

問題は、ループが実行された後に'undefined'要素を取得するという問題です。

function diff(arr1, arr2){ 
    var newArr = []; 
    for(i=arr1[0]; i<=arr1.length; i++){ 
     if(arr2.indexOf(arr1[i])=== -1){ 
     newArr.push(arr1[i]); 
     } 
    } 
    console.log(newArr); 
}; 

diff([1,2,3,4], [1,2,3]); 

この結果は[4, undefined]です。何が間違っているのですか?

+6

'I = ARR1 [0]'あなたは – user234461

+3

が<= length' 'までループ欲しいものはおそらくではありません古典的なoff-by-oneエラーでもあります。 – deceze

答えて

1

forループが正しく定義されていません。それはi=0で開始し、実行する必要がありますが、結果の配列の最後の未定義の値を加え、その結果、必要とされる複数回の反復しようとしているi<=arr1.lengthまで実行することによりi<arr1.length

function diff(arr1, arr2){ 
    var newArr = []; 
    for(i=0; i<arr1.length; i++){ 
     if(arr2.indexOf(arr1[i])=== -1){ 
     newArr.push(arr1[i]); 
     } 
    } 
    console.log(newArr); 
}; 

まで。コメントでMario Garciaが言っているように、最後の反復でループは存在しないarr[4]にアクセスしようとします。そのため定義されていません。

+0

明確にするには、arr1 [4] = undefinedで、arr2には "undefinned"が含まれていないため、この関数はnewArrに関数を追加します。上記のようにループインデックスを修正してください –

+0

ありがとう、私は睡眠が必要ですね:) – 11223342124

+0

問題はありません!簡単に間違いを作る – millerbr

0

イテレータが0(最初の配列要素と一致する)から始まらず、インデックスゼロの配列の値からループが間違っています(数字は1ですが、かなり可多くのもの)。イテレータが配列の長さに達するとインデックス範囲外に出ます。その場合は4で、arr1 [4]は定義されていませんです。

ループ開始値と条件を固定した後、我々が得る:

function diff(arr1, arr2){ 
 
    var newArr = []; 
 
    for(i = 0; i < arr1.length; i++){ 
 
     if(arr2.indexOf(arr1[i])=== -1){ 
 
     newArr.push(arr1[i]); 
 
     } 
 
    } 
 
    alert(newArr); 
 
}; 
 

 
diff([1,2,3,4], [1,2,3]); // 4 
 
diff([1,2,3,4,5], [1,3]); // 2, 4, 5

関連する問題