Tengo 2 matrices. ¿Cómo puedo verificar si el Array 2 está en el Array 1 y cómo puedo encontrar el índice del primer Array?
0: (2) ['pik13', 'karo10'] 1: ['karo14'] 2: ['karo11'] 3: (2) ['karo6', 'pik10'] 4: ['herz10'] 5: (3) ['pik11', 'kreuz10', 'kreuz11'] 0: (3) ['pik11', 'kreuz10', 'kreuz11']Estas son las 2 matrices. La salida esperada debe ser 5.
Si el orden no importa puedes usar lo siguiente:
const searchIn = [ ["pik13", "karo10"], ["karo14"], ["karo11"], ["karo6", "pik10"], ["herz10"], ["pik11", "kreuz10", "kreuz11"], ]; const searchFor = ["pik11", "kreuz10", "kreuz11"]; /** * Check if the the elements in an array matches the elements in the Set * @param {Array} array * @param {Set} toBeFound * @returns */ function compareArray(array, toBeFound) { // early outs it the element is not an array or the length does not match if (!Array.isArray(array) || array.length !== toBeFound.size) return false; // finds match in O(n) due fast lookup in Set return array.every((item) => toBeFound.has(item)); } /** * Search for array in array. * @param {Array} toBeSearched * @param {Array} toBeFound * @returns */ function searchForArray(toBeSearched, toBeFound) { // use a set to make the lookups faster => O(1) const elements = new Set(toBeFound); return toBeSearched.findIndex((array) => compareArray(array, elements)); } console.log(searchForArray(searchIn, searchFor));Set para acelerar la búsqueda cuando se comparan valores de matriz con O(1) en contraste con el uso de includes() , lo que resultará en el peor tiempo de ejecución de búsqueda de O(n) . Por esta razón, el peor tiempo de ejecución para compareArray() es O(n) en lugar de O(n²) . En la mayoría de los casos, incluso será significativamente más rápido, ya que, por ejemplo, en su ejemplo, solo hay una matriz que coincide en longitud con la matriz que buscamos, por lo que solo comparamos los valores de la matriz una vez. En general, en el peor de los casos, el algoritmo tomará O(m * n) donde m es el número de matrices para buscar y n es el número de elementos en la matriz que estamos buscando.Esto no funcionará si busca matrices anidadas, pero puede funcionar con algunos cambios para comparaciones profundas.
Si el orden SÍ importa...
let arr =[['pik13', 'karo10'],['karo14'],['karo11'],['karo6', 'pik10'],['herz10'],['pik11', 'kreuz10','kreuz11'],]; let compare = ['pik11', 'kreuz10', 'kreuz11']; let index = arr.findIndex(x => JSON.stringify(x)===JSON.stringify(compare)); // This could also for a bit more speed use String(x) === String(compare) as @Thomas notes in the below comments console.log(index); Como se señaló en los comentarios, JSON.Stringify puede ser muy lento, para matrices pequeñas y cálculos no intensivos probablemente esté bien, así que aquí hay un método más rápido para comparar 1 por 1 que no convierte la matriz en una cadena:
let arr =[['pik13', 'karo10'],['karo14'],['karo11'],['karo6', 'pik10'],['herz10'],['pik11', 'kreuz10', 'kreuz11']]; let compare = ['karo6', 'pik10']; let index = arr.findIndex(x => x.length === compare.length && x.every((v,i)=> compare[i] === v)); console.log(index);Si el orden NO importa...
let arr =[['pik13', 'karo10'],['karo14'],['karo11'],['karo6', 'pik10'],['herz10'],['pik11', 'kreuz10', 'kreuz11']]; let compare = ['kreuz10', 'kreuz11', 'pik11']; let index = arr.findIndex(x => x.length === compare.length && x.every((i)=> compare.includes(i))); console.log(index);Puede usar JSON.stringify para la igualdad de matrices y findIndex para obtener el índice de resultados.
const array2D = [['pik13', 'karo10'],['karo14'],['karo11'],['karo6', 'pik10'],['herz10'],['pik11', 'kreuz10', 'kreuz11']] const subjectArray1D = ['pik13', 'karo10']; const result = array2D.findIndex((array1D) => { return JSON.stringify(array1D) === JSON.stringify(subjectArray1D); }); console.log(result);