Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

108
Vistas
Ordenar una matriz de objetos en función de la mejor coincidencia con otra matriz

Tengo una serie de cadenas que se pueden ver como una plantilla/referencia:

 // Template let template = ['A', 'B', 'C'];

También tengo una matriz de objetos que contienen algunas de las cadenas de la matriz:

 // Source (to be sorted) let source = [ { items: ['B', 'D', 'E'] }, { items: ['E', 'L', 'Y'] }, { items: ['G', 'B', 'A'] }, { items: ['C', 'B', 'A'] } ];

Ahora necesito encontrar una manera de ordenar los items en la matriz de source haciendo coincidir la matriz de template (de mejor a peor). El orden de las cadenas en los items es irrelevante.

Según mi ejemplo anterior, el resultado después de ordenar se vería así:

 // Result after sorting let sorted = [ { items: ['C', 'B', 'A'] }, // 3 matches (A, B, C) { items: ['G', 'B', 'A'] }, // 2 matches (A, B) { items: ['B', 'D', 'E'] }, // 1 match (B) { items: ['E', 'L', 'Y'] } // no match ];

Con el método de JavaScript .sort() y .localCompare() puedo ordenar una matriz basada en cadenas, pero no pude encontrar una manera de ordenar por una 'plantilla' de matriz dada.

Estaría más que feliz si alguien sabe cómo hacerlo. ¡Gracias de antemano!

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Puede basar su lógica en el tamaño del Set que contiene elementos distintos tanto de la template como de los items . Cuanto más pequeño es el Set , más elementos comunes:

 const template = ['A', 'B', 'C']; const source = [ { items: ['B', 'D', 'E'] }, { items: ['E', 'L', 'Y'] }, { items: ['G', 'B', 'A'] }, { items: ['C', 'B', 'A'] } ]; const target = source .map(({items}) => ({items, size: new Set([...items, ...template]).size})) .sort((a, b) => a.size - b.size); console.log(target);

En caso de que no esté tratando con valores distintos en sus matrices, esto podría ser más apropiado:

 const template = ['A', 'B', 'C']; const source = [ { items: ['B', 'D', 'E'] }, { items: ['E', 'L', 'Y'] }, { items: ['G', 'B', 'A'] }, { items: ['C', 'B', 'A'] } ]; const target = source .map(({items}) => ({ items, size: items.reduce((a, v) => a + template.includes(v), 0) })) .sort((a, b) => b.size - a.size); console.log(target);

Esto se puede optimizar aún más convirtiendo la template en un Set .

about 4 years ago · Juan Pablo Isaza Denunciar

0

Simplemente necesita crear una función de clasificación adecuada que compare 2 elementos de matriz. Por ejemplo, puede contar los elementos que coinciden con su plantilla.

 function sortByMatch(template) { const items = new Set(template) const rank = arr => arr.filter(item => items.has(item)).length return (a, b) => rank(b.items) - rank(a.items) } let template = ['A', 'B', 'C']; let source = [ { items: ['B', 'D', 'E'] }, { items: ['E', 'L', 'Y'] }, { items: ['G', 'B', 'A'] }, { items: ['C', 'B', 'A'] } ]; const sorted = source.slice().sort(sortByMatch(template)) console.log(sorted.map(item => item.items.join(', ')))

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda