2017-03-20 20 views
0

数値配列が数値配列のバリエーションに一致するかどうかを調べる必要があります。私は基本的には論理に固執しています。配列内の数値の組み合わせを見つける

var myData = [1, 201, 100] 

考える

は私の試みはこれまでのところ、私はこの にそれを縮小しましたどこにも行かれていない以下の事前設定の組み合わせで任意の順序で見つかったこれらの3つの数字

var combo1 = [1, 100, 200] 
var combo2 = [1, 101, 201] 
var combo3 = [1, 100, 201] 
var combo4 = [1, 101, 200]; 

ですhttps://jsfiddle.net/0mvk9dj4/1/

var myData = [1, 201, 100]; 

var combo1 = [1, 100, 200] 
var combo2 = [1, 101, 201] 
var combo3 = [1, 100, 201] 
var combo4 = [1, 101, 200]; 
var combos = [combo1, combo2, combo3, combo4]; 

function findCombo(data) { 
    var found = false 
    for (var i = 0; i < combos.length; i++) { 
    var combo = combos[i]; 
    for (var x = 0; x < combo.length; x++) { 
     for (var y = 0; y < data.length; y++) { 
     if (data[y] === combo[x]) { 
      found = true; 
      break; 
     } else { 
      found = false; 
     } 
     } 
    } 
    } 
    console.log("Found? " + found) 
    return found; 
} 

findCombo(myData); 
+0

combo1-4は修正されましたか?コード実行中に変更されることはありませんか? –

+0

確かに彼らは固定されています – jozenbasin

答えて

2

findCombo機能はあなたの問題を解決するための機能的なアプローチを使用しています。 Mozilla Developer Networkの.every()および.some()メソッドについて詳しくは、お気軽にお問い合わせください。

var myData = [1, 201, 100]; 

var combo1 = [1, 100, 200]; 
var combo2 = [1, 101, 201]; 
var combo3 = [1, 100, 201]; 
var combo4 = [1, 101, 200]; 

var combos = [combo1, combo2, combo3, combo4]; 

function findCombo(data, combos) { 
    return combos.some(function(combo) { 
    return combo.every((item) => data.includes(item)); 
    }); 
} 

console.log(findCombo(myData, combos)); 
+0

私はこれが答えの中で最速であることを発見しました。ありがとう! https://jsperf.com/array-combo-check/1 – jozenbasin

1

以下のコードでまたは.filter().every().some()

var myData = [1, 201, 100]; 
 

 
var combo1 = [1, 100, 200] 
 
var combo2 = [1, 101, 201] 
 
var combo3 = [1, 100, 201] 
 
var combo4 = [1, 101, 200]; 
 
var combos = [combo1, combo2, combo3, combo4]; 
 
var res = combos.filter(combo => combo.every(n => myData.some(curr => curr === n))); 
 

 
console.log(res); 
 

 
var res = combos.findIndex(combo => combo.every(n => myData.some(curr => curr === n))); 
 

 
console.log(combos[res]);

+0

'myData'はテスト対象の入力ですので、' myData.every(n => combos.some(combo => combo.includes(n))) 'のようなものではないでしょうか? – nnnnnn

+0

@nnnnnn現在確認できないコンピュータには現在ありません。 Answerでのアプローチは、combos配列内の一致する配列のインデックスを返すべきである – guest271314

+1

私たちは逆の角度から同じものに近づいているのかもしれません。私はmyDataの '.every()'を 'myData'のすべての要素が[combosの1つにあります]と考えていたので、' myData'に配置しましたが、すべての配列が同じ長さなので、反対の方法はおそらく大丈夫です。今私はそれを見ても、私の論理は、myDataの各要素が* some *配列であることをチェックしている可能性があります。 – nnnnnn

関連する問題