Tengo una matriz 2d como este:

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

Cada índice se almacena un interior de la matriz que contiene las coordenadas de algún elemento.

¿Cómo puedo utilizar Array.indexOf() para comprobar si el recién generado conjunto de coordenadas que ya está contenido en arr? Quiero empujar en arr si sólo la coordenada NO es un duplicado.

Aquí está mi intento de que no funciona:

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

Parece indexOf() no funciona 2d de las matrices…

OriginalEl autor phoeberesnik | 2014-07-24

5 Comentarios

  1. 16

    Usted puede utilizar indexOf complicadas matrices (a menos que serializar que hacen de todo, cada coordenada en cadenas), usted tendrá que usar un bucle for (o mientras) para la búsqueda de que las coordenadas de la matriz suponiendo que se conoce el formato de la matriz (en este caso es en 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]);
    }

    Esta aplicación bucles y las apropiaciones de cada valor. Si usted se preocupa por el rendimiento que puede hacer cosas más complicadas, como la clasificación de la matriz original por el primer índice y, a continuación, utilizando una búsqueda binaria en el primer índice.

    Otra forma de cubo de la primera coordenada de cada elemento de la matriz en un objeto (como una tabla hash) del cucharón y el segundo valor en cada uno de los cubos para reducir los tiempos de búsqueda; más info aquí http://en.wikipedia.org/wiki/Bucket_sort.

    De lo contrario, esto es, probablemente, suficiente para lo que necesitas.

    OriginalEl autor user654628

  2. 6

    Trabajo js violín

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

    Mucho más de un hacky forma de un índice simple, pero funciona

    OriginalEl autor joegandy

  3. 2

    No una respuesta completa sólo una nota al margen que puede ayudar.

    Uso Lodash

    Este método de obtener la posición de un valor dentro de una matriz de 2 dimensiones

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

    Como se mencionó anteriormente, usted necesita un bucle anidado para atravesar a través de la matriz.

    OriginalEl autor Mendo

  4. 1

    Porque esta es una Matriz bidimensional, se necesita un bucle for anidado.

    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;
    }

    OriginalEl autor bencripps

  5. 0

    puede utilizar este método,

    function isArrayItemExists(array , item) {
        for ( var i = 0; i < array.length; i++ ) {
            if(JSON.stringify(array[i]) == JSON.stringify(item)){
                return true;
            }
                }
                return false;
    }

    OriginalEl autor Dinu

Dejar respuesta

Please enter your comment!
Please enter your name here