Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

162
Views
Valor de búsqueda de otra matriz y claves de grupo

Tengo 2 etiquetas de matrices y nombres de tipos:

 const tags = [ { title: 'Warrior', data: { type: 'audience' } }, { title: 'Juggler', data: { type: 'section' } }, { title: 'Journey', data: { type: 'audience' } }, { title: 'Travel', data: { type: 'nonexistingtag' } } ]; const typenames = [ { audience: 'au' }, { section: 'se' }, { sponsor: 'sp' }, { contextual: 'co' } ]

El resultado esperado es crear una cadena que se agrupa por claves que coinciden entre el tipo array1 y array2 y cada clave está separada por la tubería "|" símbolo y cada grupo está separado por "&" entre sí, por lo que para la muestra anterior, la cadena de salida final esperada sería:

 au=Warrior|au=Journey&se=Juggler

Esto es lo que probé hasta ahora,

 let arr = []; tags.forEach(element => { typenames.forEach(el => { if (Object.keys(el)[0] === element.data.type) // finding matching keys and pushing to an arr arr.push({ title: Object.values(el)[0], desc: element.title }); }) });

Ordene las claves para que sean fáciles de agrupar:

 arr.sort((a, b) => { let keya = a.title; let keyb = b.title; if (keya > keyb) { return 1; } else if (keya < keyb) { return -1; } else { // the characters are equal. return 0; } });

Concatenar la cadena:

 let str = ''; arr.forEach(({ title, desc }, i, arr2) => { if (title === arr2[i + 1]?.title) { // Check that the next item in array has the same title str = str.concat(`${title}=${desc}|`) return; } str = str.concat(`&${title}=${desc}`) }); console.log('str', str);

Salida: au=Warrior|&au=Journey&se=Juggler

Problemas :

  1. Dado que estoy revisando el siguiente elemento en la matriz para ver si el título coincide, entonces hay un "&" adicional no requerido
  2. ¿Hay una manera más fácil de lograr lo mismo? (¿Usando taquigrafía, filtros, etc.?)
about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Teniendo en cuenta el problema, en última instancia, desea iterar a través de todos los nombres de tipos y ver qué valores coinciden en las etiquetas, por lo que debe comenzar reestructurando la matriz de etiquetas para que sea más fácil de buscar, en lugar de tratar de recorrer todo el algo intrincado. estructura cada vez. Tal vez un objeto indexado por el tipo, por ejemplo:

 { audience: ['Warrior', 'Journey'], section: ['Juggler'], nonexistingtag: ['nonexistingtag'] }

Luego, al revisar los nombres de tipos, todo lo que necesita hacer es buscar la propiedad vinculada en el objeto y unir dos veces:

  • una vez para unir los títulos: ['Warrior', 'Journey'] a au=Warrior|au=Journey
  • una vez para unir los títulos unidos de todos los nombres de tipo en una sola cadena

Es mucho más fácil usar estructuras de datos agrupados como matrices que puede unir en lugar de agregar un separador en función de si el siguiente elemento de la matriz tiene una determinada propiedad.

 const tags=[{title:"Warrior",data:{type:"audience"}},{title:"Juggler",data:{type:"section"}},{title:"Journey",data:{type:"audience"}},{title:"Travel",data:{type:"nonexistingtag"}}],typenames=[{audience:"au"},{section:"se"},{sponsor:"sp"},{contextual:"co"}]; const titlesByType = {}; for (const { title, data: { type } } of tags) { titlesByType[type] ??= []; titlesByType[type].push(title); } const combinedStrs = []; for (const typeObj of typenames) { const [[key, abbrev]] = Object.entries(typeObj); if (titlesByType[key]) { combinedStrs.push(titlesByType[key].map(str => `${abbrev}=${str}`).join('|')); } } const output = combinedStrs.join('&'); console.log(output);

about 4 years ago · Juan Pablo Isaza Report

0

Use matrices para manejar la tokenización

Este es un truco estándar para obtener inteligentemente "pegamento" correcto al ensamblar cuerdas.

  1. Comience creando una matriz de elementos
  2. Use Array.prototype.join para producir la cadena final

Estoy pensando en algo como esto:

 let items = arr.reduce((output, { title, desc }, i, fullArray) => { if (title === fullArray[i + 1]?.title) { output.push(`${title}=${desc}|`) } return output }, []) let str = items.join('&')
about 4 years ago · Juan Pablo Isaza Report

0

Puedes probar este método simple y legible:

 const availableTags = [ { title: 'Warrior', data: { type: 'audience' } }, { title: 'Juggler', data: { type: 'section' } }, { title: 'Journey', data: { type: 'audience' } }, { title: 'Travel', data: { type: 'nonexistingtag' } } ]; const availableTypenames = [ { audience: 'au' }, { section: 'se' }, { sponsor: 'sp' }, { contextual: 'co' } ]; const getResultString = (tags, typenames) => { let result = ''; for (const typename of typenames) { const type = Object.keys(typename)[0]; let needSeparate = false; for (const tag of tags) { if (type === tag.data.type) { result +=`${needSeparate ? '|' : '&'}${typename[type]}=${tag.title}`; needSeparate = true; } } } return result.slice(1); } console.log(getResultString(availableTags, availableTypenames))

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!