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()来检查新生成的坐标集是否已包含在中arr?arr如果只有坐标不重复,我想进入.
这是我的尝试不起作用:
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.
否则,这可能足以满足您的需求.
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方式,但它确实有效