2009-12-21 7 views
0

Je parcours une série de données json qui portent les résultats de quelques tables de base de données. Parmi les autres données, j'ai une table RateTable ... erm ... et une table Resources. Le RateTable a un nom de propriété ResourceId qui lie à l'enregistrement de ressources. Donc, je suis en train d'itérer sur mon RateTable et j'ai besoin de référencer mon enregistrement Resource et de l'utiliser en le copiant dans sa propre variable. Voici ce que j'ai jusqu'à présent:jquery copy json object

if (data) 
    { 
     var rs = data.Resources; 

     $.each(data.RateTables, function(i,item){ 
      if (item.RateTableTypeId == 91) 
      { 
       var r = getresource(item.SupplierResourceId, rs) 
       if (r) 
        customer_options += '<option value="' + r.ResourceId + '">' + r.Name + '<\/option>'; 
      } 
      else if (item.RateTableTypeId == 92) 
      { 
       var r = getresource(item.CustomerResourceId, rs) 
       if (r) 
        supplier_options += '<option value="' + r.ResourceId + '">' + r.Name + '<\/option>'; 
      } 

     }); 

     $(".ddl-customer").html(customer_options); 
     $(".ddl-supplier").html(supplier_options); 
    } 

    function getresource(id, items) 
    { 
     $.each(items, function(i,item){ 
      if (item.ResourceId == id) 
       return $.extend(true, {}, item); 
     }); 
    } 

Le problème est que je getResource ne retourne pas une copie de mon élément de ressources dans la variable r. Pourquoi?

Désolé, je ne peux pas publier certaines des données json, c'est absolument énorme, c'est pourquoi nous laissons le référencement au côté client pour réduire la charge utile de données. J'espère qu'il y en aura assez pour aider quelqu'un à voir ce que j'essaie de faire.

Lloyd

Répondre

2

Le problème est que je getResource ne retourne pas une copie de mon élément de ressources dans la variable r. Pourquoi?

La propriété getresource n'a pas d'instruction de retour. Il existe une instruction return dans la fonction anonyme utilisée par l'appel $ .each() dans getresource. Cette déclaration retourne de la fonction anonyme et de nouveau dans $ .each(). $ .each() interprète la valeur renvoyée - s'il y en a une - comme un booléen indiquant s'il faut continuer l'itération. Mais cette valeur n'est jamais renvoyée à getresource, qui n'a pas d'instruction return pour le renvoyer quand même. Pour plus de détails sur $ .each().

Une solution possible consiste à utiliser le code natif de javascript pour la boucle à la place, par ex.

function getresource(id, items) { 
    for (var i = 0; i < items.length; ++i) { 
     var item = items[i]; 
     if (item.ResourceId == id) { 
      return $.extend(true, {}, item); 
     } 
    } 
} 

Une autre option est de continuer à utiliser .each $() mais le retour de getResource, par exemple

function getresource(id, items) { 
    var r = null; 
    $.each(items, function(i, item){ 
     if (item.ResourceId == id) { 
      r = $.extend(true, {}, item); 
      return false; // end $.each() loop 
     } 
    }); 
    return r; 
} 
1

Je dois admettre que je suis encore à apprendre et je ne l'ai jamais vu personne revenir un $.extend d'une fonction ...

Oren est juste de vous avoir besoin de retourner un faux si la valeur est introuvable , donc je vais lui donner +1.

De plus, j'ai essayé de tester votre fonction à l'aide return $.extend(false, {}, items); et il semble que if (r) sera toujours vrai, car r est un objet,

Je devine que vous essayez de revenir deux variables d'une fonction?Quoi qu'il en soit la meilleure façon de revenir mutliple les variables d'une fonction serait d'utiliser quelque chose comme ceci:

function getresource(id, items) 
    { 
     $.each(items, function(i,item){ 
      if (item.ResourceId == id) 
       return [true, item]; 
     }); 
     return false; 
    } 

puis r [0] contient la valeur booléenne et r [1] contient l'élément (si cela est vrai)