¿Cómo se busca en una matriz una coincidencia de subcadena?

1 minuto de lectura

avatar de usuario de reub77
reub77

Necesito buscar una matriz en JavaScript. La búsqueda sería solo para que coincida una parte de la cadena, ya que la cadena tendría componentes adicionales. Entonces necesitaría devolver el elemento de matriz coincidente con éxito con la cadena completa.

Ejemplo:

const windowArray = [ "item", "thing", "id-3-text", "class" ];

Necesito buscar el elemento de matriz con "id-" en él y también necesito extraer el resto del texto en el elemento (es decir, "id-3-text").

¿Cómo puedo hacer eso?

  • Podrías simplemente filtrar la matriz results = arr.filter(function (v) {return /id-/.test(v)});. Y luego podrías hacer lo que quieras con los resultados.

    – zzzzBov

    20/04/2016 a las 15:50

  • @zzzzBov Tu comentario merece una respuesta…

    – Skippy el Gran Gourou

    23 de mayo de 2019 a las 11:15

  • Considerar windowArray.find((string) => string.startsWith("id-")) si solo te interesa id- como posible prefijo.

    – Sebastián Simón

    1 de noviembre de 2021 a las 22:52

avatar de usuario de nickb
apodo

Si eres capaz de usar Subrayado.js en su proyecto, el _.filtrar() La función de matriz hace que esto sea muy fácil:

// find all strings in array containing 'thi'
var matches = _.filter(
    [ 'item 1', 'thing', 'id-3-text', 'class' ],
    function( s ) { return s.indexOf( 'thi' ) !== -1; }
);

La función de iterador puede hacer lo que quieras siempre que devuelva verdadero para las coincidencias. Funciona genial.

Actualización 2017-12-03:

Esta es una respuesta bastante desactualizada ahora. Tal vez no sea la opción de mayor rendimiento en un lote grande, pero se puede escribir un lote de forma más concisa y utilice métodos nativos de ES6 Array/String como .filter() y .includes() ahora:

// find all strings in array containing 'thi'
const items = ['item 1', 'thing', 'id-3-text', 'class'];
const matches = items.filter(s => s.includes('thi'));

Nota: No hay soporte String.prototype.includes() (Edge funciona, eso sí), pero está bien con un polyfill, o simplemente recurre a indexOf().

  • @ Floppy88 Bueno, la pregunta original era para buscar dentro de una matriz simple; también es un poco largo en el diente ahora (no es necesario subrayar). ¿Estaría buscando valores de objeto o claves? Un ejemplo de caso de uso sería útil.

    – nickb

    4 de diciembre de 2017 a las 0:02

  • Necesito buscar en claves de objeto

    – Disquete88

    4 de diciembre de 2017 a las 9:35

  • @ Floppy88 Solo usa Object.keys(yourArrayName), que devuelve una matriz. Puedes usar la misma técnica anterior para .filter() abajo.

    – nickb

    5 de diciembre de 2017 a las 5:58


  • usar la función .filter() es el mejor método en la mayoría de los casos

    – Anand Raja

    7 de enero de 2020 a las 8:37

La gente aquí está haciendo esto demasiado difícil. Solo haz lo siguiente…

myArray.findIndex(element => element.includes("substring"))

buscarÍndice() es un método de orden superior de ES6 que itera a través de los elementos de una matriz y devuelve el índice del primer elemento que coincide con algunos criterios (proporcionado como una función). En este caso, utilicé la sintaxis de ES6 para declarar la función de orden superior. element es el parámetro de la función (que podría ser cualquier nombre) y la flecha ancha declara lo que sigue como una función anónima (que no necesita estar entre llaves a menos que ocupe más de una línea).

Dentro de findIndex() Usé el muy simple includes() método para verificar si el elemento actual incluye la subcadena que desea.

  • desarrollador.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

    – Sourabh

    25 de mayo de 2020 a las 4:03

  • Esto es EXACTAMENTE lo que necesitaba, y una gran respuesta moderna. ¡Votar! Para usar más, asígnelo a una nueva variable y luego haga lo que necesite con él. Ej: miArray[newVar]

    – DORRITO

    31 de marzo de 2021 a las 3:13

  • fallará cuando la cadena esté vacía

    – praveen seela

    28 de mayo de 2021 a las 9:38

  • Esta es la solución más eficaz: jsbench.me/mal528m9cl/1

    – thdoan

    1 de julio a las 9:23

  • includes hacer una comparación estricta, ¿cómo funcionaría aquí como includes devuelve falso si no se encuentra el elemento coincidente?

    – Volátil3

    6 de julio a las 20:08

avatar de usuario de smnth90
smnth90

La forma más sencilla de obtener la matriz de subcadenas de la matriz dada es usar el filtro e incluye:

myArray.filter(element => element.includes("substring"));

El anterior devolverá una matriz de subcadenas.

myArray.find(element => element.includes("substring"));

El anterior devolverá el primer elemento de resultado de la matriz.

myArray.findIndex(element => element.includes("substring"));

El anterior devolverá el índice del primer elemento de resultado de la matriz.

  • Esto devuelve el primer partido.

    – 00-BBB

    23 de septiembre de 2019 a las 10:18

  • @ 00-BBB reemplazar buscar con filtro

    – mercurio

    21 de enero de 2020 a las 3:09

  • Gracias @Hos Mercurio. Sí, el filtro devolverá la lista

    – smnth90

    18 de febrero de 2020 a las 10:12

Avatar de usuario de TJ Crowder
TJ Crowder

En tu caso específico, puedes hacerlo simplemente con un viejo y aburrido contador:

var index, value, result;
for (index = 0; index < windowArray.length; ++index) {
    value = windowArray[index];
    if (value.substring(0, 3) === "id-") {
        // You've found it, the full text is in `value`.
        // So you might grab it and break the loop, although
        // really what you do having found it depends on
        // what you need.
        result = value;
        break;
    }
}

// Use `result` here, it will be `undefined` if not found

Pero si su matriz es escasopuede hacerlo de manera más eficiente con un diseño adecuado for..in círculo:

var key, value, result;
for (key in windowArray) {
    if (windowArray.hasOwnProperty(key) && !isNaN(parseInt(key, 10))) {
        value = windowArray[key];
        if (value.substring(0, 3) === "id-") {
            // You've found it, the full text is in `value`.
            // So you might grab it and break the loop, although
            // really what you do having found it depends on
            // what you need.
            result = value;
            break;
        }
    }
}

// Use `result` here, it will be `undefined` if not found

Cuidado con los ingenuos for..in bucles que no tienen el hasOwnProperty y !isNaN(parseInt(key, 10)) cheques; este es el por qué.


Fuera de contexto:

Otra forma de escribir

var windowArray = new Array ("item","thing","id-3-text","class");

es

var windowArray = ["item","thing","id-3-text","class"];

…que es menos tipeo para ti, y quizás (este bit es subjetivo) un poco más fácil de leer. Las dos declaraciones tienen exactamente el mismo resultado: una nueva matriz con esos contenidos.

Avatar de usuario de JohnnyJS
johnnyjs

Solo busque la cadena en simple viejo indexOf

arr.forEach(function(a){
    if (typeof(a) == 'string' && a.indexOf('curl')>-1) {
            console.log(a);
    }        
});

  • No es aplicable para valores nulos.

    – Walzade Tushar

    15 oct 2018 a las 14:12

  • Si tiene tipos mixtos en su matriz, eso es solo una mala práctica, pero agregué el cheque de todos modos.

    – JohnnyJS

    17 de octubre de 2018 a las 8:24

El código javascript de vainilla más simple para lograr esto es

var windowArray = ["item", "thing", "id-3-text", "class", "3-id-text"];
var textToFind = "id-";

//if you only want to match id- as prefix 
var matches = windowArray.filter(function(windowValue){
  if(windowValue) {
      return (windowValue.substring(0, textToFind.length) === textToFind);
  }
}); //["id-3-text"]

//if you want to match id- string exists at any position
var matches = windowArray.filter(function(windowValue){
  if(windowValue) {
      return windowValue.indexOf(textToFind) >= 0;
  }
}); //["id-3-text", "3-id-text"]

  • No es aplicable para valores nulos.

    – Walzade Tushar

    15 oct 2018 a las 14:12

  • Si tiene tipos mixtos en su matriz, eso es solo una mala práctica, pero agregué el cheque de todos modos.

    – JohnnyJS

    17 de octubre de 2018 a las 8:24

Avatar de usuario de Tgr
Tgr

Para un examen fascinante de algunas de las alternativas y su eficiencia, vea las publicaciones recientes de John Resig:

(El problema discutido allí es ligeramente diferente, ya que los elementos del pajar son prefijos de la aguja y no al revés, pero la mayoría de las soluciones son fáciles de adaptar).

¿Ha sido útil esta solución?