Javascript 2d数组indexOf

pho*_*nik 23 javascript arrays 2d indexof

我有一个像这样的二维数组:

var arr = [[2,3],[5,8],[1,1],[0,9],[5,7]];
Run Code Online (Sandbox Code Playgroud)

每个索引都存储一个包含某个元素坐标的内部数组.

如何使用Array.indexOf()来检查新生成的坐标集是否已包含在中arrarr如果只有坐标不重复,我想进入.

这是我的尝试不起作用:

if (arr.indexOf([x, y]) == -1) {
    arr.push([x, y]);
}
Run Code Online (Sandbox Code Playgroud)

它似乎indexOf()不适用于2D阵列......

use*_*628 19

你不能使用indexOf做复杂的数组(除非你序列化它使每个坐标都成为字符串),你需要使用for循环(或while)来搜索该数组中的坐标,假设你知道数组的格式(在这种情况下,它是2d).

var arr = [[2,3],[5,8],[1,1],[0,9],[5,7]];
var coor1 = [0, 9];
var coor2 = [1, 2];

function isItemInArray(array, item) {
    for (var i = 0; i < array.length; i++) {
        // This if statement depends on the format of your array
        if (array[i][0] == item[0] && array[i][1] == item[1]) {
            return true;   // Found it
        }
    }
    return false;   // Not found
}

// Test coor1
console.log("Is it in there? [0, 9]", isItemInArray(arr, coor1));   // True

// Test coor2
console.log("Is it in there? [1, 2]", isItemInArray(arr, coor2));   // False

// Then
if (!isItemInArray(arr, [x, y])) {
   arr.push([x, y]);
}
Run Code Online (Sandbox Code Playgroud)

此实现循环并获取每个值.如果你关心性能,你可以做更复杂的事情,比如用第一个索引对原始数组进行排序,然后在第一个索引上使用二进制搜索.

另一种方法是将数组中每个项目的第一个坐标存储在一个对象(如哈希表)中,并在每个存储桶中存储第二个值以减少搜索时间; 更多信息,请访问http://en.wikipedia.org/wiki/Bucket_sort.

否则,这可能足以满足您的需求.


joe*_*ndy 6

工作js小提琴

for(var k = 0; k < arr.length; k++){
    if(arr[k][0] == x && arr[k][1] == y){
        found = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

除了简单的索引之外,还有更多的hacky方式,但它确实有效