2017-01-02 13 views
1

私は現時点では困惑しています。基本的には、参照と配列として数値をとり、subArrayに重複する組み合わせを持たずに0に等しい組み合わせ(参照番号と配列から2つ)を見つける関数を作成しようとしています。サブアレイの複製物の挿入を避ける

function helper(number, arr){ 
    console.log(arr, 'this is arr') 
    let answer = []; 
    let subArray = [] 
    for(let i = 0; i < arr.length; i++){ 
    for(let y = i + 1; y < arr.length; y++){ 
     var newCombo = [arr[i], arr[y]] 
     subArray.push(newCombo) <-- avoid duplicates here 
    } 
    } 
    subArray.forEach(combo =>{ 
    var referenceAndArray = [number].concat(combo) 
    //result will check it adds up to zero 
    var result = referenceAndArray.reduce((accum, value) =>{ 
     return accum += value; 
    },0) 

    if(result === 0){ 
     answer.push(referenceAndArray) 
    } 
    }) 

    return answer 
} 

helper(-1, [-1,-1,0,1,2] --> [ [-1, 0, 1 ], [-1, -1, 2] ] 

私たちは、私がArray.includesを使用してテストをしようとしたが、それはサブアレイを持つとうまく動作しないようです配列が開始

からソートされていると仮定することができます。

+0

ちょうど1の組み合わせまたはすべての可能な組み合わせを見つけます? – luanped

+0

重複のないすべての可能な組み合わせを見つける – Alejandro

+1

配列は値ではなく同一性によって比較されるので、 '[]!== []' – elclanrs

答えて

1

配列はIDで識別され、値ではないため、配列の内容を結合して比較して、既に存在するかどうかを確認できます。

基本的に置き換えるsubArray.push(newCombo) <-- avoid duplicates here

例えば

let exists = subArray.some(combo => combo.join() === newCombo.join()); if (!exists) { subArray.push(newCombo); }

とあなたが[[-1, -1, 2], [-1, 0, 1]]を含む配列を持っていると場合は、別の組み合わせを見つけたとき[-1, -1, 2]。挿入する前にすでに存在するかどうかをチェックし、そうでない場合にのみ追加します。これを行うには、.some()(配列の1要素が一致する限りtrue)を使用して、文字列 "-1、-1,2"が既に存在するかどうかをチェックします。この場合、 "-1、-1,2"と "-1,0,1"と比較されますので、existsが真であるため、配列に追加するのはスキップします。

+0

Worked great!私は 'Array.prototype.some'を知らなかった。便利なデフ! – Alejandro

1

Setを使用して、ペアの文字列バージョンを保存すると、重複が保存されないことが保証されます。これは、より速く、アレイここ

内の要素を検索するよりも動作します、それはそのように動作させるために、最小限の適応を持つあなたのコードは次のとおりです。

function helper(number, arr){ 
 
    console.log(JSON.stringify(arr), 'this is arr'); 
 
    let answer = []; 
 
    let subArray = []; 
 
    let uniques = new Set; 
 
    for(let i = 0; i < arr.length; i++){ 
 
    for(let y = i + 1; y < arr.length; y++){ 
 
     uniques.add(arr[i] + ',' + arr[y]); // add primitive (string) to set. 
 
    } 
 
    } 
 
    uniques.forEach(s => { 
 
    // now get the number parts of the stored string: 
 
    var referenceAndArray = [number].concat(s.split(',').map(Number)); 
 
    //result will check it adds up to zero 
 
    var result = referenceAndArray.reduce((accum, value) =>{ 
 
     return accum += value; 
 
    }, 0) 
 

 
    if(result === 0){ 
 
     answer.push(referenceAndArray); 
 
    } 
 
    }) 
 

 
    return answer; 
 
} 
 

 
var result = helper(-1, [-1,-1,0,1,2]); //--> [ [-1, 0, 1 ], [-1, -1, 2] ] 
 
console.log(JSON.stringify(result));

関連する問題