Quiero reorganizar las oraciones para que cada oración sea un requisito previo para la siguiente oración y esto es lo que tengo y funciona bien:
const sentences = [ "he has eaten a pizza at the party last night", "he has eaten a pizza", "he has eaten a pizza at the party", ] function sessionCardsSort(arr) { arr = arr.map(part => part.split(' ')).sort((a, b) => a.length - b.length); function sortBy(list, main) { return list.sort((a, b) => { let count1 = 0, count2 = 0; a.forEach(part => { if(main.includes(part)) { count1++ } }); b.forEach(part => { if(main.includes(part)) { count2++ } }); return count1 - count2; }); } return sortBy(arr, arr[arr.length - 1]).map(part => part.join(' ')); } console.log(sessionCardsSort(sentences)); Como puede ver, utilicé una matriz simple con sentences nombradas como estructura de datos para trabajar, pero ¿qué pasa si queremos usar los mismos datos de la matriz de sentences con una nueva estructura como esta?
const sentences = [ { reference: ['he has eaten a pizza at the party', 'last night'] } { reference: ['"he has', 'eaten a pizza'] }, { reference: ['he', 'has', 'eaten a pizza at the party'] }, ]Entonces, el problema es que quiero implementar exactamente la misma función esta vez para una matriz de objetos, ¡no solo una matriz simple!
Aquí está el resultado deseado (solo usando la función anterior exacta):
const sentences = [ { reference: ['"he has', 'eaten a pizza'] }, { reference: ['he', 'has', 'eaten a pizza at the party'] }, { reference: ['he has eaten a pizza at the party', 'last night'] } ] Nota: en la segunda estructura de datos, unir elementos dentro de cada reference le dará la misma oración que el primer ejemplo, por ejemplo:
{ reference: ['he has eaten a pizza at the party', 'last night'] } "he has eaten a pizza at the party last night"Nota: tenga en cuenta que quiero implementar exactamente la misma función
Dado que las palabras de cada oración son un subconjunto estricto de otra oración en el conjunto, o la oración es la más grande, parece que sería mucho más fácil verificar la longitud total de las cadenas.
Asigne a cada oración una propiedad de longitud (que es la longitud de la cadena unida), y luego ordene la matriz de objetos resultante por esa longitud, y finalmente elimine la propiedad de longitud agregada.
const sentences = [ { reference: ['"he has', 'eaten a pizza'] }, { reference: ['he', 'has', 'eaten a pizza at the party'] }, { reference: ['he has eaten a pizza at the party', 'last night'] } ]; function sessionCardsSort(sentences) { const sentencesWithLength = sentences.map( ({ reference }) => ({ reference, length: reference.join(' ') }) ); return sentencesWithLength .sort((a, b) => a.length - b.length) .map(({ reference }) => ({ reference })); } console.log(sessionCardsSort(sentences));O calcule la longitud cada vez dentro de la devolución de llamada: más trabajo (lo que podría ser un problema cuando se trata de grandes conjuntos de datos), pero menos código.
const sentences = [ { reference: ['"he has', 'eaten a pizza'] }, { reference: ['he', 'has', 'eaten a pizza at the party'] }, { reference: ['he has eaten a pizza at the party', 'last night'] } ]; const toLength = arr => arr.reference.join(' ').length; const sessionCardsSort = (sentences) => sentences .sort((a, b) => toLength(a) - toLength(b)); console.log(sessionCardsSort(sentences)); No parece necesario dada la entrada en la pregunta, pero si realmente necesita contar palabras individualmente, use una función con una lógica similar a su sortBy actual para contar la cantidad de palabras incluidas.
const sentences = [ { reference: ['"he has', 'eaten a pizza'] }, { reference: ['he', 'has', 'eaten a pizza at the party'] }, { reference: ['he has eaten a pizza at the party', 'last night'] } ]; const toLength = obj => obj.reference.join(' '); const toWordsIncluded = (obj, mainWords) => obj.reference .join(' ') .split(' ') .reduce((subtotal, word) => subtotal + mainWords.includes(word), 0) const sessionCardsSort = (sentences) => { const sorted = sentences .sort((a, b) => toLength(a) - toLength(b)); const mainWords = sorted[sorted.length - 1].reference.join(' ').split(' '); return sorted .sort((a, b) => toWordsIncluded(a, mainWords) - toWordsIncluded(b, mainWords)); }; console.log(sessionCardsSort(sentences));