2017-01-01 4 views
1

私はJavaScriptには比較的新しいので、私は余裕があります。 Freecodecampの問題の1つを解決しながら、2つのアレイで一意の値を見つける必要がありました。私は少しのコードを書いた。Javaスクリプトの配列の最後に不明な要素がありますか?

整数だけを含む配列でうまく動作します。この問題は、文字列配列を比較するときに発生します。末尾の要素が最終的な出力配列に追加され、表示されません。このコードには1つの値しか出力されません。

このようなものです。

"[*] Total unique values found = 2" 
"[*] Unique values = pink wool," 

これはコードです。かなり難読化されています。

function diffArray(arr1, arr2) { 
    var newArr = []; 
    var length1 = arr1.length; 
    var length2 = arr2.length; 
    var test = true; 
    var tab = '  '; 
    console.log('[*] Starting ... '+tab); 

    while(arr1.length > 0 && arr2.length > 0) 
    { 
    console.log('[*] Entering while loop.'); 
reset: 
    for (var i=0; i<arr2.length; i++) 
    { 
     console.log('[*] Comparing '+arr1[0]+' and '+arr2[i]); 
     if(arr1[0] == arr2[i]) 
     { 
     console.log('[*] Matched ... ') 
     console.log(' $ Removig '+arr1[0]+' from arr1 and arr2'); 
     arr1.splice(0, 1); 
     arr2.splice(i, 1); 
     console.log(" $ arr1 length = "+arr1.length); 
     console.log(" $ arr2 length = "+arr2.length); 
     break reset; 
     } else if (i == arr2.length-1) 
     { 
     console.log(" $ No match found."); 
     console.log('[*] Pushing '+arr1[0]+' in newArr'); 
     newArr.push(arr1[0]); 
     arr1.splice(0, 1); 

     console.log('[*} newArr = '+newArr); 
     } else { 
     console.log('[*] Match failed.') 
     } 
    } 
    } 

    if(arr2.length > 0) { 
    newArr.push(arr2); 
    } else { 
    newArr.push(arr1); 
    } 
console.log('[*] Total unique values found = '+newArr.length); 
console.log('[*] Unique values = '+newArr); 
} 

diffArray(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]); 

ここに、実施例のJSBinへのリンクがあります。ここで

は機能していない文字列配列を持つJSBinへのリンクは...助けを

おかげです。

+1

助けを求めるときは、時間をかけてコードを読みやすく、一貫してフォーマットしてください。 –

+2

例としてJSBinを使用する必要はありません。[Stack Snippets](http://meta.stackoverflow.com/questions/270944/feedback-requested-stack-snippets-2-0)を使用して質問を実行可能にしてください。 – Barmar

+0

@Barmarはチップをありがとう。私はそれについて知らなかった。 – Dimensionless

答えて

2

probl EMはあなたのwhileループは、二つの配列を反復処理して要素を比較した後、次のとおりです。

if(arr2.length > 0) { 
    newArr.push(arr2); 
} else { 
    newArr.push(arr1); 
} 

あなたがELSEIFに他を変更する必要があります(arr1.length> 0)あなたは空の配列(何をプッシュしていないように、 arr1の左)をnewArrに追加します。

と言われていますが、kevin ternetは、あなたがしようとしているものよりはるかに優れた代替手段です。

+0

ありがとうございました。それがそれを解決しました。 – Dimensionless

2

書くときnewArr.push(arr2); を新しい要素としてnewArrに追加しています。

enter image description here

私はあなたの配列を連結したいと思います。これを行うには、あなただけの連結newArr.push.apply(newArr, arr2);

enter image description here

+0

次回はそのことを覚えておきます。 – Dimensionless

3

を使用することができ、フィルターは

var diffArray = (arr1, arr2) => arr1.concat(arr2).filter((x,i,arr) => arr.indexOf(x) === arr.lastIndexOf(x)); 
 

 
var res = diffArray(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]); 
 

 
console.log(res);

を倍増し、古いJavaScriptで:

function diffArray(arr1, arr2) { 
    return arr1.concat(arr2).filter(function(x,i,arr) { 
     return arr.indexOf(x) === arr.lastIndexOf(x) 
    }) 
} 
+0

ありがとうございました。そのコードは決して発生しませんでした。 – Dimensionless

+0

コードが少し説明できますか?=> – Dimensionless

+0

@Dimensionless Yes申し訳ありません。これは、関数の矢印表記です。私は私の答えの最後にそれをtraducted –

関連する問題