Necesito obtener el recuento de un conjunto específico de palabras duplicadas en una cadena.

Puedo devolver las apariciones de una palabra, pero estoy atrapado en varias palabras.

const sData = 'am=1&am=2&pm=1&pm=2&pm=3&ac=1&dc=1';
const aData = sData.split('&');

const nData = aData.filter(el => el.includes('am')).length;

Esto devuelve 2, que es lo esperado, pero necesito hacer lo mismo para pm, ac y dc y, según tengo entendido, includes no acepta valores múltiples.

1
UXCODA 9 may. 2019 a las 23:23

4 respuestas

La mejor respuesta

¡Puede abarcar el trabajo repetido usando funciones !

const countOccurrencesOf = (word, search) => {
  return word.filter(el => el.includes(search)).length;
};

Ahora, puede reutilizar esta función para todas sus otras necesidades de búsqueda de cadenas:

countOccurrencesOf(aData, 'pm');
countOccurrencesOf(aData, 'ac');
countOccurrencesOf(aData, 'dc');
2
jakemingolla 9 may. 2019 a las 20:27
  • Cree una variedad de palabras clave que desea encontrar.
  • Cree una expresión regular separando las palabras con un |.
  • Utilice match Obtenga todas las coincidencias para las palabras clave especificadas.
  • Crea un objeto counter. Recorra el conjunto de coincidencias y cuente cada aparición
const str = 'am=1&am=2&pm=1&pm=2&pm=3&ac=1&dc=1',
      toFind = ['am', 'pm', 'ac'],
      regex = new RegExp(toFind.join("|"), "g"),
      matches = str.match(regex);

console.log(matches)

const counter = {};
matches.forEach(m => counter[m] = counter[m] + 1 || 1)

console.log(counter)
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
adiga 9 may. 2019 a las 21:00

Lo que estás buscando es una función recursiva. En el ejemplo que ha proporcionado, supongo que analiza las variables de consulta de URL. Entonces, supongamos que los siguientes son sus delimitadores: & o =.

Esta función muestra una idea general de lo que parece que estás tratando de lograr.

 function containsDuplicates(string,delimiter,foundDuplicates){
    var str = string.split(delimiter);

    if(foundDuplicates.includes(str)){
        return true;
    }else if(string.indexOf(str) < string.length){
        foundDuplicates.push(str);
        return containsDuplicates(string,delimiter,foundDuplicates);
    }
    else{
        return false;
    }
}
1
Jacob Gaiski 9 may. 2019 a las 20:34

Intenta usar el mapa en su lugar:

const sData = 'am=1&am=2&pm=1&pm=2&pm=3&ac=1&dc=1';
const aData = sData.split('&');

// define the stings you want to count
const nData = {am: 0, pm: 0, ac: 0}

// iterate over the split input data
const val = aData.map((obj) => {
    // iterate over the nData
    Object.keys(nData).forEach((count) => {
        // if the input contains the count, add to the count
        if (obj.includes(count)) nData[count]++;
    })
})
console.log(nData); // returns: { am: 2, pm: 3, ac: 1 }

¡Reducir probablemente funcionaría también!

1
j0hnm4r5 9 may. 2019 a las 20:54