0
votes

Algorithme efficace pour commander des objets imbriqués dans un tableau

Il semble assez facile mais quand je pense à la façon dont je voudrais l'écrire, il se transforme en gros désordre et je veux que ce soit aussi efficace que possible (dans un montant raisonnable au moins). J'ai également deux questions relatives à ce problème.

1) Donc, j'ai une gamme d'objets qui ressemblent à ce xxx

mais la position n'est pas garantie ordre, comme celui-ci xxx

et j'aimerais que l'algorithme soit boucler dans la matrice et saisissez l'identifiant dans l'ordre croissant en fonction des positions, naturellement je voudrais faire Quelque chose avec l'identifiant que je reçois dans la boucle, je pourrais donc avoir une sorte de boucle et dans la boucle d'impression 'j'ai mangé' + id de sorte qu'il sortirait comme Xxx

2) pense à cela comme un scénario différent, mais en utilisant la même structure de données qu'avant xxx

et je sors de l'objet avec id orange afin il ressemble à ceci xxx

mais maintenant les positions n'ont pas de sens car il y a 0 -> 2 -> 3 -> 4 mais pas de position 1, donc je voudrais Pour les remettre dans une ordonnance ascendante appropriée (il doit contenir la même séquence, il doit donc continuer à faire pomme -> banane -> mangue -> raisin) de sorte qu'il se transforme en xxx < p> Comment irait-je Faites ce meilleur aussi?

Remarque: il pourrait y avoir un scénario où je dois sortir plus d'un objet, mais je suppose que cela n'a pas d'importance car je ne peux que le faire de manière séquentielle ou quelque chose. < / p>

merci!


2 commentaires

Merci pour la question. S'il vous plaît prendre un moment pour partager avec nous ce que vous avez déjà essayé. Nous sommes ici pour vous aider à déboguer du code existant, mais votre question pourrait être satisfaite de la négativité, car vous demandez une solution de programmation sans faire de votre propre effort.


Pourquoi ne pas simplement utiliser quelque chose d'appartienne à Array.ProTotype .sort () ?


3 Réponses :


0
votes

Vous pouvez le faire avec Trier et carte

P>

let arr = [{id: 'apple', position: 2},{id: 'orange', position: 0},{id: 'banana', position: 1}];
let op = arr.sort((a,b)=> a.position-b.position).map(e=> `I ate ${e.id}`);

console.log(op)


2 commentaires

Pourquoi utiliser mapper () ici et créer un tout nouveau tableau si op veut simplement imprimer la phrase "j'ai mangé {id}"? Il y aurait moins de frais généraux avec une simple itération de la matrice triée via foreach () .


@Benbeck "L'optimisation prématurée est la racine de tout mal" :)



3
votes

j'ai cassé ceci dans

  1. tri li>
  2. RÉCALCULATION DE POSITION LI>
  3. Travailler avec des fruits triés li> ol>

    p>

    const fruit = [{id: "apple", position: 0},{id: "banana", position: 2}, {id: "grape", position: 4}, {id: "mango", position: 3}];
    
    // 1. Sort the fruit by position
    fruit.sort((a, b) => a.position - b.position);
    
    console.log(fruit)
    
    // 2. Recalculate position
    fruit.forEach((o, idx) => {
      o.position = idx;
    });
    
    console.log(fruit)
    
    // 3. Work with the sorted fruit
    console.log(fruit.map(({ id }) => `I ate ${id}`))


1 commentaires

C'est parfait, j'ai eu des boucles à l'intérieur des boucles et c'était juste un gâchis. Totalement oublié, j'ai eu ces fonctions disponibles, merci!



0
votes

amm..too tard pour poster! Mais j'espère que cela peut aider les autres! "vrai" data-babel = "faux">

var arr = [{
    id: 'apple',
    position: 0
}, {
    id: 'banana',
    position: 2
}, {
    id: 'grape',
    position: 4
}, {
    id: 'grapeeee',
    position: 5
}]
var old = 0,
    next = 1;
arr.sort(function(a, b) {

    if (old != a.position) {
        a.position = old;
    }
    if (next != b.position) {
        b.position = next;
    }

    var keyA = a.position,
        keyB = b.position;
    console.log(keyA, "--", keyB)
    old++;
    next++;

    if (keyA < keyB) return -1;
    if (keyA > keyB) return 1;
    return 0;

});
console.log("arr--", arr);
for (var i = 0; i < arr.length; i++) {
    console.log("I ate ", arr[i].id)
}


0 commentaires