2016-02-12 103 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>');

相关问题