在javascript中查找数组中的数组

时间:2014-09-25 16:30:37

标签: javascript arrays indexof

基本上,我试图在数组对象中找到一个数组元素,但它总是返回-1。

这是代码

function myFunction() {
  var myArray = [[0,1],[1,1],[1,2]];
  var a = myArray .indexOf([0,1]);
  document.getElementById("demo").innerHTML = a;
}
<p>Click the button to display the position of the element "[0,1]":</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>

4 个答案:

答案 0 :(得分:2)

var myArray = [[0,1],[1,1],[1,2]];

在线上存储myArray对象中的三个数组对象。

现在您正在尝试检查其上的新数组的索引。

var a = myArray .indexOf([0,1]); //这里[0,1]是新的数组对象,它有不同的引用

所以它总会返回-1。

只是为了验证,你可以这样做。

&#13;
&#13;
function myFunction() {
  var a1 = [0,1];
  var a2 = [1,1];
  var a3 = [1,2];

  var myArray = [a1,a2,a3];
  var a = myArray.indexOf(a1);
  document.getElementById("demo").innerHTML = a;
}
&#13;
<p>Click the button to display the position of the element "[0,1]":</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
&#13;
&#13;
&#13;

它返回0,因为这里a1不是新对象

答案 1 :(得分:1)

它与javascript如何比较对象有关。从MDN复制:

  

请注意,当且仅当其比较是基元时,对象才会转换为基元。如果两个操作数都是对象,则将它们作为对象进行比较,并且只有当两个操作数引用同一个对象时,相等性测试才为真。

(不要忘记JS Array在技术上是Object)。你甚至可以在浏览器中看到这个非常简单(假设你有一些开发工具可供你使用):

[0, 1] == [0, 1];  # false -- They're different objects even though they have the same values.

但这是有效的,因为它们是相同的对象:

a = [0, 1];
a == a;  # true

答案 2 :(得分:1)

转换和比较字符串

严格比较对象是错误的,因为没有两个对象是相同的。您可以使用join()split()将数组中的每个数组转换为字符串。然后使用indexOf代替"0,1"

[0,1] === [0,1] // false

"0,1" === "0,1" // true

目标: ["0,1","1,1","1,2"].indexOf("0,1")这是indexOf()的预期用途

<小时/>
  
var needle = [0,1].join(); // or "0,1"
var haystack = [ [0,1],[1,1],[1,2] ];
var index = haystack.join('-').split('-').indexOf(needle); 
 
document.getElementById("demo").innerHTML = index ;  
<p id="demo"></p>

  • .join('-')生成"0,1-1,1-1,2"

  • .split('-')生成["0,1", "1,1", "1,2"]

  • .indexOf("0,1")生成0


独立功能

var needle = [0,1];
var haystack = [["0,1"],["1,1"],["1,2"]];
var index = getIndex(needle, haystack) // returns 0

function getIndex(needle, haystack) {      
    return haystack.join('-').split('-').indexOf( needle.join() );          
} 

答案 3 :(得分:0)

问题是.indexOf()使用严格的相等比较===。对于数组和对象,除非它们是同一个实例,否则永远不会成立,你可以看到:

[0,1] === [0,1] //Returns false

Reference MDN docs on Comparison

因此,您必须迭代数组才能找到相等索引。类似的东西:

function myFunction() {
  var myArray = [[0,1],[1,1],[1,2]];
  var a = -1;
  var find = [0,1];
  
  var idx = 0;
  myArray.map(function(item) {
      var valid = true;
      for(var i=0; i<item.length; i++) {
          if(item[i] !== find[i])
             valid = false;
      }
      if(valid)
          a = idx;
      idx++;
  });
  document.getElementById("demo").innerHTML = a;
}
<p>Click the button to display the position of the element "[0,1]":</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>