2016-09-07 6 views
0

配列のグループ全体で最初の共通要素を見つける必要があります。配列の数はさまざまですが、それらは常に順番に(小さい→大きい)順番に並んでいます。私の配列はすべてmyObjのプロパティです。Javascriptの複数の配列にまたがる共通の要素

function compare(myObj,v,j) { 
    if (myObj[j].indexOf(v)>-1) return true; 
    else return false; 
} 

function leastCommon ([1,5]) { 
    var myObj = { //This is filled by code, but the finished result looks like this 
    1: [1, 2,...,60,...10k] 
    2: [2, 4,...,60,...20k] 
    3: [3, 6,...,60,...30k] 
    4: [4, 8,...,60,...40k] 
    5: [5,10,...,60,...50k] 
    }; 
    var key = [1,2,3,4,5]; //also filled by code 
    var lcm = myObj[key[key.length-1]].forEach(function(v) { //Iterate through last/largest multiple array 
    var j=key[key.length-2]; 
    while (j>=0) { 
    if (compare(myObj,v,j)) { //check to see if it is in the next lower array, if yes, check the next one. 
     j--; 
    } 
    if (j>0 && (compare(myObj,v,j+1))===true) return v; //before the loop exits, return the match 
    } 
}); 
return lcm; 
} 

私が間違っているかわからないんだけど、それは未定義戻っている:

これは私がこれまで持っているものです。

注:forEachは未定義を返し、コードを修正しようとしましたが、私のエディタから "潜在的な無限ループ"エラーが発生します。変更されたコードは次のようになります。

function leastCommon ([1,5]) { 
    var myObj = { //This is filled by code, but the finished result looks like this 
    1: [1, 2,...,60,...10k] 
    2: [2, 4,...,60,...20k] 
    3: [3, 6,...,60,...30k] 
    4: [4, 8,...,60,...40k] 
    5: [5,10,...,60,...50k] 
    }; 
    var key = [1,2,3,4,5]; //also filled by code 
    var lcm = 0; 
    myObj[key[key.length-1]].forEach(function(v) { //Iterate through last/largest multiple array 
    var j=key[key.length-2]; 
    while (j>=0) { 
     if (compare(myObj,v,j)) { //check to see if it is in the next lower array, if yes, check the next one. 
     j--; 
     } 
     if (j>0 && (compare(myObj,v,j+1))===true) lcm = v; //before the loop exits, set lcm = v 
    } 
    }); 
return lcm; 
} 
+0

いくつかの例と必要な結果を追加してください。 –

+0

@Nina Scholz私は、2つの数字のうちの最小公倍数と、それらの間のすべての数字を見つけることを任されてきました。だから、私は、各番号の倍数の配列を作成し、すべての配列で共通の最初の倍数を見つけなければならないと決めました。例:input = 1-5;結果は60になります。 – Pi10tSec

答えて

0

あなたが最初に一致/失敗を見つけたときの方法を終了する方法がないので、私はのforEachを使用していないだろう。ルーピングを続ける必要があります。代わりにeveryとindexOfを使って定期的なforループを調べるべきです。また、このコードでは配列がソートされているので、最小の番号が最初に来ると仮定しています。そうでなければ、配列のクローンを持つ単純なsort()がそれを解決できます。

//pass in arrays, assumes array is sorted 
 
function getFirstCommon (arrs) { 
 
    //Loop over the elements in the first array 
 
    for (var i=0; i<arrs[0].length; i++) { 
 
    //get the value for the current index 
 
    var val = arrs[0][i]; 
 
    //make sure every array has the value 
 
    //if every does not find it, it returns false 
 
    var test = arrs.every(function (arr) { 
 
     //check the array to see if it has the element 
 
     return arr.indexOf(val)!==-1; 
 
    }); 
 
    //If we find it, than return the current value 
 
    if (test) { 
 
     return val; 
 
    } 
 
    } 
 
    //if nothing was found, return null 
 
    return null; 
 
} 
 

 
//test numbers 
 
var nums = [ 
 
    [1,2,3,4,5,6], 
 
    [2,3,4,5,6], 
 
    [3,4,5,6], 
 
    [4,5,6,7,8,9], 
 
    [6,7,8,9] 
 
]; 
 
    
 
console.log(getFirstCommon(nums)); //6 
 
    
 
var nums2 = [ 
 
    [1,2,3,4,5,6], 
 
    [2,3,4,5,6], 
 
    [3,4,5,6], 
 
    [4,5,6,7,8,9], 
 
    [5,7,8,9] 
 
]; 
 
    
 
console.log(getFirstCommon(nums2)); //5 
 

 
var nums3 = [ 
 
    [1,2,3,4,5,6], 
 
    [7,8,9,10,11,12], 
 
    [7,8,9,10,11,12] 
 
]; 
 
    
 
console.log(getFirstCommon(nums3)); //null

コードは、それ自体がすべての

0

ファーストをチェックしない場合、あなたは無限ループを持っています向上させることができました。最初にcompare()が失敗した場合は、jを減らすことはなく、同じ番号をチェックし続けます。

第2:あなたはkey配列が決して減少しないので、常に最後の2つの配列を比較します。

+0

OK、無限ループが表示されます。何らかの理由で、私はループを壊して偽にし、次の番号に行くと思った。私はリワークします。 – Pi10tSec

関連する問題