J'ai un tableau de phrases et un objet que ses propriétés pointent vers chaque index de phrase et les valeurs qui représentent le score de la phrase comme ceci:
result = [0, 2, 3]
si je veux créer un tableau nommé result pour stocker l'index des phrases avec les scores les plus bas et ignorer l'index des phrases avec le score le plus élevé, alors je peux faire quelque chose comme ceci:
var object = {0: 10, 1: 100, 2: 100, 3: 100};
Le code ci-dessus fonctionne bien jusqu'à ce que nous ayons plus d'une valeur la plus élevée comme celle-ci (égale et supérieure):
var object = {0: 10, 1: 100, 2: 80, 3: 90},
max = Math.max(...Object.values(object)),
result = Object
.keys(object)
.filter(k => object[k] !== max)
.map(Number);
console.log(result); Cette fois, result array ne renvoie que [0] et nous perdons tous les égaux et les plus élevés.
Je veux modifier le code pour que si nous rencontrions cette situation, alors seule la phrase avec longueur plus longue sera supprimée.
Dans notre exemple, phrases [1] = "Je suis un bon médecin" est le plus long parmi les index de 1 , 2 et 3 puis nous le supprimons et le résultat final serait:
var sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a']; // sentence with index 0 score 10 and sentence with index 3 score 90 .
var object = { 0: 10, 1: 100, 2: 80, 3: 90}; // index of sentences with their scores
J'ai beaucoup essayé mais peu importe ce que j'essaye, enfin, je viens de recevoir plus confus ... :(
4 Réponses :
Si vous devez conserver les données telles quelles, essayez ceci. J'ai utilisé la suggestion de @Daniyal Lukmanov dans ma réponse.
var sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a'];
var object = {0: 10, 1: 80, 2: 100, 3: 100};
maxScore = Math.max(...Object.values(object));
var maxScoreSentences = [];
for (var i=0; i <sentences.length; i++){
if(object[i] === maxScore) {
maxScoreSentences.push(sentences[i]);
}
}
lengthsMax = Math.max(...maxScoreSentences.map(s => s.length));
result = Object
.keys(object)
.filter(k => object[k] !== maxScore || sentences[k].length !== lengthsMax)
.map(Number);
console.log(result);
Merci pour la réponse plus un mais je veux aussi la structure :)
Vous recherchez la longueur maximale des phrases avec le score maximal, non?
Ajoutez simplement les longueurs maximales de vérification:
var sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a'];
var object = {0: 10, 1: 100, 2: 100, 3: 100},
lengthsMax = Math.max(...sentences.map(s => s.length)),
max = Math.max(...Object.values(object)),
result = Object
.keys(object)
.filter(k => object[k] !== max || sentences[k].length !== lengthsMax)
.map(Number);
console.log(result);
Merci pour la réponse plus un mais essayez ceci: var object = {0: 10, 1: 80, 2: 100, 3: 100}, ... la longueur maximale doit être comprise entre les valeurs les plus élevées égales ! Pas la longueur maximale de toutes les phrases
Le résultat que vous voulez est la concaténation des résultats avec un score inférieur à max et des résultats avec un score égal à max.
const sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a'];
const object = {0: 10, 1: 100, 2: 100, 3: 100};
const max = Math.max(...Object.values(object));
const objectKeys = Object.keys(object);
const equalValues = objectKeys.map((k,i) => object[k] === max ? sentences[i].length : 0);
const lengthsMax = Math.max(...equalValues);
const resultEqualToMax = objectKeys
.filter((k,i) => object[k] === max && sentences[i].length !== lengthsMax)
.map(Number);
const resultLessThenMax = objectKeys
.filter(k => object[k] !== max)
.map(Number);
const result = [...resultLessThenMax,...resultEqualToMax];
console.log(result);
Vous pouvez également utiliser la méthode sort , puis supprimer l'élément trié au niveau le plus élevé:
var sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a'];
var object = { 0: 10, 1: 100, 2: 80, 3: 90};
var result = Object.keys(object).map(Number)
.sort((i, j) => object[i] - object[j] ||
sentences[i].length - sentences[j].length);
result.pop(); // discard last
console.log(result);
Et s'il y avait 2 phrases ou plus de même longueur?
Il n'y a pas ... je le promets :)