2017-03-20 95 views
0

我需要檢查傳入數值數組是否與一組數值數組的任何變體匹配。我基本上只是堅持邏輯。查找數組中的數字組合

鑑於

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]; 

我嘗試到目前爲止是無處可去,所以我已經將其降低到這個 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開發者網絡上關於.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

您可以使用.findIndex().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目前不在電腦可以檢查某些。在答案的方法應該返回組合數組內匹配數組的索引 – guest271314

+1

也許我們只是從相反的角度接近相同的東西。我把'.every()'放在'myData'上,因爲我把它當作「myData'的每個元素都在[其中一個組合]中」,但是所有的數組長度都是相同的,相反的方式可能很好。雖然我現在看到它,但我認爲我的邏輯有問題,因爲它可能檢查'myData'中的每個元素都在* some *數組中,而不是全部在同一個數組中。 – nnnnnn