0
votes

Comment puis-je trier un tableau tout en préservant la commande

J'ai un tableau E.G. 3,4,3,1,5

Le tri en ordre croissant ou décroissant donne 1,3,3,4,5 ou 5,4,3,3,1.

J'ai besoin de l'ordre d'origine par ex. 3,3,4,1,5

Underscorejs a la méthode de groupeby, mais qui scindre le tableau dans les groupes.

Des idées?


8 commentaires

Qu'est-ce qui qualifie un groupe?


QuestionData.Questtions = _.Chain (Questiondata.Questtions) .Sortby ('Catégorie') .ach (Fonction (résultant, IndexNew) {résultatsNew.order = IndexNew + 1;}) .Sortby ('ordre') .value () ;


Cloner le tableau d'origine !?


Cela ressemble à un problème X-y, surtout compte tenu du contexte supplémentaire dans ce commentaire de code. Vous n'êtes probablement pas en fait Tri des chiffres, êtes-vous?


Par exemple. Nous pourrions remplacer la selle ("catégorie") avec groupeby ("catégorie"). mais cela change le format de la sortie.


Correct. Mais je trie sur la catégorie, qui est un nombre


Ce n'est pas clair, quel ordre vous avez besoin ... Voulez-vous commander le tableau par la clé de tableau?


Je commande sur la «catégorie» de chaque élément de tableau, qui a une valeur numérique.


3 Réponses :


1
votes

Si vous souhaitez trier la matrice en place, vous pouvez obtenir la priorité pour chaque élément et trier code> à l'aide de l'objet prioritaire

p>

const 
    array = [3, 4, 3, 1, 5],
    counter = array.reduce((acc, n) => acc.set(n, acc.get(n) + 1 || 1), new Map),
    output = Array.from(counter).flatMap(([n, count]) => Array(count).fill(n))

console.log(output)


0 commentaires

1
votes

Vous pouvez faire

const arr = [3, 4, 3, 1, 5];

const result = arr.sort((a, b) => a === b || arr.indexOf(a) - arr.indexOf(b));

console.log(result);


6 commentaires

QuestionData.Questtions = _.Chain (Questiondata.Questtions) .Sortby ('Catégorie') .ach (Fonction (résultant, IndexNew) {résultatsNew.order = IndexNew + 1;}) .Sortby ('ordre') .value () ;


Je ne trie pas réellement sur 3,4,3,1,5, je trie sur une propriété "catégorie" d'un tableau qui a ces valeurs. Comment cela peut-il être appliqué ce qui précède?


Je suppose questiondata.questions.sort ((a, b) = >.Category === b.category || questiondata.questions.indexof (a) - questiondata.questions.indexof (b));


Cela n'a pas changé n'a pas été regroupés du tout.


Oh, et Groupby commande également sur la catégorie, ce que je ne veux pas que ce soit. J'en ai besoin pour garder l'ordre existant, il suffit de les regrouper.


Vous pouvez afficher l'objet ou un objet avec la même structure et votre sortie attendue.



0
votes

Voici ma solution assez longue qui fonctionne, mais pourrait faire le raffinage.

             var tempQuestions = [];

            // For each Question.
            _.each(questionData.questions, function (resultCategory, indexCategory) {
                // Get other Question for the same Category, and push to new Array.
                tempQuestions.push(_.filter(questionData.questions, function (num) {
                    return num.category === resultCategory.category;
                }));
                // Remove all Question for the processes Cateogory (these are now stored in the tempQuestions)
                questionData.questions = _.filter(questionData.questions, function (item) {
                    return item.category !== resultCategory.category;
                });
            });

            // The above processing will create some unwanted blank arrays, remove them.
            tempQuestions = _.filter(tempQuestions, function (num) {
                return num.length !== 0;
            });

            // Flatten the array structure to match the original.
            questionData.questions = _(tempQuestions).chain()
                .zip()
                .flatten()
                .value();


0 commentaires