2010-01-26 2 views
4

J'ai 2 tableaux d'objets. Chaque objet a une propriété Id. Maintenant, si j'ai un troisième tableau de juste IDs, quelle est la meilleure et plus rapide façon de trouver des objets de array1 en fonction de ces Ids et les déplaçant vers array2.Trouver et déplacer un objet dans un tableau javascript par l'ID d'un objet

Merci beaucoup pour répondre ..

Exemple de code:

Person = function(id, fn, ln) { 
    this.id = id, 
    this.firstName = fn, 
    this.lastName = ln 
} 

array1 = new Array(); 
// add 500 new Person objects to this array 

array2 = new Array(); 
// add some other new Person objects to this array 

function moveArrayItems(ids) { 
    // ids is an array of ids e.g. [1,2,3,4,5,6,...] 
    // Now I want to find all the person objects from array1 whose ids 
    // match with the ids array passed into this method. Then move them to array2. 
    // What is the best way to achive this? 
} 
+0

Les appels '... = new Array();' ne sont pas nécessaires. La meilleure façon de créer des tableaux en Javascript est d'utiliser le tableau littéral: '... = [];'. –

Répondre

9

Si vous avez vraiment des objets 500+ dans chaque tableau, vous êtes probablement mieux d'utiliser un hachage pour stocker les objets, les clés sont id:

var people = { 
       1: {id:1, name:"George Washington"}, 
       2: {id:2, name:"John Adams"}, 
       3: {id:3, name:"Thomas Jefferson"}, // ... 
      } 

var people2 = {} 

Maintenant, il est trivial (et beaucoup, beaucoup plus rapide) pour déplacer les choses par ID:

function moveArrayItems(ids) { 
    var i,id; 
    for (i=0; i<ids.length; i++){ 
     id = ids[i]; 
     if (people1[id]) { 
      people2[id] = people1[id]; 
      delete people1[id]; 
     } 
    } 
} 
+0

Je reçois les objets de json, qui est un tableau avec index de o .. n. Je peux boucler cela et construire un nouvel objet/tableau avec index en utilisant id. Y a-t-il une autre meilleure approche que la boucle? – Bharat

+0

Si vous faites principalement de la manipulation dans votre code, le coût O (n) pour pré-traiter le tableau dans un hachage vaut le coût. – justkt

0

Juste un pseudo code non testé rapide. Cela donne un algorithme O (n^2) donc il ne peut pas être meilleur.

function moveArrayItems(ids) { 
    // ids is an array of ids e.g. [1,2,3,4,5,6,...] 
    //Now I want to find all the person objects from array1 whose ids match with the ids array passed into this method. Then move them to array2. 
    //What is the best way to achive this? 
    for(i = 0;i < ids.length;i++){ 
     var found = false; 
     var j = 0; 
     while(!found && j < array1.length){ 
      if(array1[j].id = ids[i]){ 
      array2.push(array1[j]); 
      found = true; 
      }    
      j++; 
     } 
    } 
} 
+0

Cela ne les déplace pas. –

0

d'abord une petite fonction par John Resig

// Array Remove - By John Resig (MIT Licensed) 
Array.prototype.remove = function(from, to) { 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
}; 

Ensuite, la fusion de la solution de Vincent

function moveArrayItems(ids) 
{ 
    // ids is an array of ids e.g. [1,2,3,4,5,6,...] 
    // Now I want to find all the person objects from array1 
    // whose ids match with the ids array passed into 
    // this method. Then move them to array2. 
    // What is the best way to achive this? 

    for(i = 0; i < ids.length; i++) 
    {  
    var found = false; 
    var j = 0; 
    while(!found && j < array1.length) 
    { 
     if(array1[j].id = ids[i]) 
     { 
     array2.push(array1[j]); 
     array1.remove(i); 
     found = true; 
     }     
     j++; 
    } 
    } 
} 
1

Bonne question. En fait, cela m'a fait revenir en arrière et renvoyer les fondamentaux. La chose clé à propos d'un tableau JS est que son sparse. Vous pouvez créer un tableau et affecter des valeurs pour n'importe quel index (par exemple: 10 et 23). Sur la base de ce fait

array1 = new Array(); 

array1[person1.id] = person1; 
array1[person2.id] = person2; 
.... goes till N 

function moveArrayItems(ids) { 
    for(index in ids) { 
     array2.push(array1[ids[index]]); 
     delete array1[ids[index]]; 
    } 
} 

NOTE: Je suppose que Person.id est un entier et inférieur à 2^32 - 1. Voir la documentation JS si id est plus ou un nombre à virgule flottante. L'implémentation JS Array n'est pas un bloc contigu, donc ne pensez pas que l'affectation d'une valeur à l'index 12345 nécessite 12345 blocs de mémoire continus.

+0

Est-ce que cela ressemble à la réponse du Triptyque en termes de vitesse? Je pense que parce que l'objet javascript est comme hashtable et vous pouvez assigner le nom de champ qui devient la clé de cette entrée. Je voulais confirmer avec vous pour vous assurer que la vitesse est la même que celle des autres réponses. – Bharat

+0

Je ne serais pas surpris si les deux fonctionnent à la même vitesse. JS Array est également similaire à la table de hachage, sauf que les clés doivent être des entiers non négatifs. L'utilisation d'un tableau peut être légèrement plus rapide qu'un objet ordinaire. Le navigateur connaît son Array et pourrait l'optimiser pour l'itération. Dans la technique de l'objet, c'est un objet au navigateur et une hashtable à vous. Vous pouvez faire un profil de type stop watch des deux réponses et décider. Si vous pouvez attendre un moment, je vais essayer de faire un profilage et de l'afficher ici. –

Questions connexes