2017-11-15 9 views
2

2つの配列の特定の要素が同じ順序で比較されるかどうかを比較しようとしています。JSは2つの異なる配列のSOME要素の順序を比較します

var compare = function (arr1, arr2) { 
 
//........ 
 
} 
 

 
compare ([f,t,r,m], [s,f,t,r,q,p,m]); //should return true 
 

 
compare ([f,t,r,m], [f,a,t,,m,r]); //should return false

私はforループを進め、その後、値が一致したときに、私はあなたが配列を比較すべきであるかなり確信しているが、私は、私は何かが欠けてる感じ識別する。

var compare = function (a, b) { 
 
    a.forEach(function(letter){ 
 
    for (i=0; i<b.length; i++) { 
 
     if (letter===b[i]) {} 
 
    } 
 
    }) 
 
}

+0

"* *同じ順序で比較" - 何?あなたが他のものの[* subsequence *](https://en.wikipedia.org/wiki/Subsequence)であるかどうかを判断しようとしていますか? – Bergi

+0

あなたは質問についてもっと明確にする必要があります –

+0

@Bergiはい、説明するのがより簡単です。私の目標は、arr1がarr2のサブシーケンスであるかどうかの検証です。 – Marco

答えて

2

DroriのソリューションはO(n^2)あなたが取ることができる

var a = [1,2,3]; 
 
var b = [0,1,4,3,9,10,2,5,6]; // 1,2,3 in wrong order 
 
var c = [0,4,1,5,6,2,8,3,5]; // 1,2,3 in right order 
 

 
// using foreach 
 
function compare(a,b){ 
 
    var i = 0; 
 
    b.forEach(function(el){ 
 
    if(el == a[i]) i++; 
 
    }) 
 
    return i == a.length; 
 
} 
 

 
// using reduce 
 
function compare2(a,b){ 
 
    return b.reduce(function(i, el){ 
 
    return el == a[i] ? i + 1 : i; 
 
    }, 0) == a.length; 
 
} 
 

 
console.log(compare(a,b) == false); // should be false 
 
console.log(compare(a,c) == true); // should be true 
 
console.log(compare2(a,b) == false); // should be false 
 
console.log(compare2(a,c) == true); // should be true

+0

実際にあなたの解決策は私が問題を解決することを可能にしました。なぜなら、OriDroriは例外を考慮しなかったからです。ここであなたがそれをチェックしたい場合はリンクhttp://www.codewars.com/kata/merged-string-checker/train/javascript – Marco

2

Array#filterArray#indexOfを使用して第一の配列に表示されていない第二の配列からすべての文字を削除します。その後Array#everyで結果を反復処理し、すべての文字が第一配列に同じ場所に表示されているかどうかを確認:これらの機能の両方がO(n)ランタイム、オリでこの比較を行います

function compare(a, b) { 
 
    var arr = b.filter(function(c) { 
 
    return a.indexOf(c) !== -1; // use a hash object instead of indexOf if the arrays are large 
 
    }); 
 
    
 
    return arr.every(function(c, i) { 
 
    return c === a[i]; 
 
    }); 
 
} 
 

 
console.log(compare(['f','t','r','m'], ['s','f','t','r','q','p','m'])); //should return true 
 

 
console.log(compare(['f','t','r','m'], ['f','a','t','m','r'])); //should return false

+0

これは 'O(n^2)'の時間に 'O(n)'の解があるときに働きます。 – tommybananas

+0

これは、配列が大きい場合に、コメント//を追加したものです。小さな配列では、それは本当に重要ではありません。 –

2

で実行されますarray2の索引を作成し、索引とarray2の要素との比較を反復して戻しながらチェックしてください。array1です。

function compare(array1, array2) { 
 
    var i = 0; 
 
    return array1.every(function (a) { 
 
     while (i < array2.length && a !== array2[i]) { 
 
      i++; 
 
     } 
 
     return a === array2[i++]; 
 
    }); 
 
} 
 

 
console.log(compare(['f', 't', 'r', 'm'], ['s', 'f', 't', 'r', 'q', 'p', 'm'])); // true 
 
console.log(compare(['f', 't', 'r', 'm'], ['f', 'a', 't', , 'm', 'r']));   // false

0

次のように行うことができます。

function compare(a,b){ 
 
    return b.filter(e => a.includes(e)) 
 
      .every((e,i) => e === a[i]) 
 
} 
 

 
console.log(compare(["f","t","r","m"], ["s","f","t","r","q","p","m"])); 
 

 
console.log(compare(["f","t","r","m"], ["f","a","t","m","r"]));

関連する問題