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.
4 respuestas
¡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');
- 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; }
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;
}
}
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!
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.