Javascript 二维数组 indexOf

IT技术 javascript arrays 2d indexof
2021-03-13 08:47:06

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

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

每个索引存储一个内部数组,其中包含某个元素的坐标。

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

这是我没有成功的尝试:

if (arr.indexOf([x, y]) == -1) {
    arr.push([x, y]);
}

看起来indexOf()不适用于二维数组...

6个回答

您不能使用 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]);
}

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

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

否则,这可能足以满足您的需要。

工作 js 小提琴

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

比简单的索引更像是一种hacky方式,但它有效

不是一个完整的答案,只是一个可能有帮助的旁注。

使用 Lodash

这个方法会让你得到一个值在二维数组中的位置

let a = [ [ 'bird' ], [ 'cat' ], [ 'dog' ], [ 'cow' ], [ 'bird' ] ];
let b = _.findIndex(a, function(el) { return el[0] == 'cow'; });
console.log(b);//answer is 3

如前所述,您需要一个嵌套循环来遍历数组。

下划线 _ 是对 Lodash 的引用。lodash.com
2021-04-22 08:47:06
我更喜欢替换return el[0] == 'cow'return el.includes('cow')
2021-04-28 08:47:06
我已经复制粘贴并尝试let b = _.findIndex(a, function(el) { return el[0] == 'cow'; });并得到ReferenceError: _ is not defined
2021-04-29 08:47:06

因为这是一个二维数组,您将需要一个嵌套的 for 循环。

var newArr = [1, 2],
    counter;


for ( var i = 0; i < arr.length; i++ ) {

    for ( var x = 0; x = arr[i].length; x++ ) {

        if ( arr[i][x] === newArr[x] {

             counter++ 
        }

        if (counter === 2) {
            alert('new coord!')
        }
    }
    //reset counter
    counter = 0;
}

非常简单,没有 indexOf...

var arr = [[2,3],[5,8],[1,1],[0,9],[5,7]];
const isDup = (x,y) => {
   arr.find(it => JSON.stringify(it) == JSON.stringify([x,y])) == undefined ? arr.push([x,y]) : null
}

console.log(isDup(2,3)) /* Does not add */
console.log(isDup(1,2)) /*Does add*/
console.log(arr) /*Confirmation*/

我确实想要一个索引,所以我使用了: const find = this.pointList.findIndex(it => JSON.stringify(it) === JSON.stringify(item));
2021-04-21 08:47:06