2016-02-12 101 views
1

我想創造的東西,如果多個值是一個數組中,可以檢測,這是我嘗試使用,但總是返回true的Javascript:我如何檢查是否一個數組包含某些價值觀

row7 = [1, 1, 1, 1, 1, 1, 1, 1]; 

var field = [row0, row1, row2, row3, row4, row5, row6, row7]; 
console.log(field[0,1]); // Get the first item in the array 


    var needles = [1, 1, 1, 1] 
    console.log(needles) 
    var haystack = field[0,row7] 
    console.log(haystack) 

    console.log(contains(haystack,needles)); 
    function contains(haystack, needles) { 

return needles.map(function (needle) { 
    return haystack.indexOf(needle); 
}).indexOf(-1) == -1; 
} 

情況也是一樣的:

row 7 = [1, 1, 1, 1, 1, 1, 1, 1] 

(連續4)檢查:

needles = [1, 1, 1, 1] 

和假:

row7 = [1, 1, 0, 1, 0, 0, 0, 1] 

編輯:

整個數組:

/* Array containing the playing field 8 x 8 

     C0 C1 C2 C3 C4 C5 C6 C7 
    R0[0][0][0][0][0][0][0][0] 
    R1[0][0][0][0][0][0][0][0] 
    R2[0][0][0][0][0][0][0][0] 
    R3[0][0][0][0][0][0][0][0] 
    R4[0][0][0][0][0][0][0][0] 
    R5[0][0][0][0][0][0][0][0] 
    R6[0][0][0][0][0][0][0][0] 
    R7[0][0][0][0][0][0][0][0] 

* \

var row0 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row1 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row2 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row3 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row4 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row5 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row6 = [0, 0, 0, 0, 0, 0, 0, 0], 
    row7 = [0, 0, 0, 0, 0, 0, 0, 0]; 

var field = [row0, row1, row2, row3, row4, row5, row6, row7]; 

有沒有辦法實現這個使用純JS?

在此先感謝。

+0

當你做indexOf你會得到0是什麼0行... ROW6? – gurvinder372

+0

似乎'contains'是指在目標數組中存在的一個值,它返回true。只有當目標數組中不存在所有值時,纔會返回false – kiro

+0

@ gurvinder372添加了整個數組。 – iSidle

回答

1

改變你的contains方法

function contains(haystack, needles) 
{ 
    return haystack.join(",").indexOf(needle.join(",")) != -1; 
} 

說明 -

  • 做加盟needle得到"1,1,1,1"

  • 和連接草堆得到"1,1,1,1,1,1,1,1"

  • 因爲針被包含在草垛

+0

這似乎工作,謝謝! 因此,如果它包含針,則返回0,否則返回-1。 – iSidle

+0

@ user5301203不,如果草垛沒有針,它會返回-1。否則,它返回針的起始位置 – gurvinder372

+0

謝謝,我現在正在工作。 – iSidle

2

我認爲最簡單的(不是最有效的)解決方案是兩個數組首先轉換成字符串,然後檢查是否一個字符串是另一個的子字符串:

function contains(array1, array2) { 
    if(array1 == null || array2 == null) 
     return false; 

    return array1.toString().contains(array2.toString()); 
} 

var row7 = [1, 1, 1, 1, 1, 1, 1, 1]; 
var needles = [1, 1, 1, 1]; 

contains(row7, needles); //returns true 

row7 = [1, 1, 0, 1, 0, 0, 0, 1] 

contains(row7, needles); //returns false 

UPDATE:

我剛剛意識到所有瀏覽器都不支持contains函數。因此最好使用indexOfreturn array1.toString().indexOf(array2.toString()) != -1;

+0

我收到以下錯誤: 未捕獲TypeError:array1.toString(...)。contains不是函數 – iSidle

+0

您使用哪種瀏覽器? –

+0

我使用谷歌瀏覽器,它也不是所有的時間,我只是用一個例子。它獲取從參數傳遞的行ID。看起來像這樣: 'var haystack = field [0,row]' – iSidle

1

您可以使用Array.prototype.every()作爲搜索的偏移量。

function check(haystack, needles) { 
 
    var offset = 0; 
 

 
    while (offset + needles.length <= haystack.length) { 
 
     if (needles.every(function (a, i) { 
 
      return haystack[i + offset] === a; 
 
     })) { 
 
      return true; 
 
     } 
 
     offset++; 
 
    } 
 
    return false; 
 
} 
 

 
var row7 = [1, 1, 1, 1, 1, 1, 1, 1], 
 
    row8 = [1, 1, 0, 1, 0, 0, 0, 1], 
 
    needles = [1, 1, 1, 1]; 
 

 
document.write(check(row7, needles) + '<br>'); 
 
document.write(check(row8, needles) + '<br>');

相關問題