2016-03-19 14 views
7

Ho un oggetto nel formato seguente e ho bisogno di ottenere tutti i valori dalla proprietà Price a tutti i livelli dell'oggetto.Ottieni valori per nome proprietà da un oggetto a diversi livelli

var o = { 
    Id: 1, 
    Price: 10, 
    Attribute: { 
     Id: 1, 
     Price: 2, 
     Modifier: { 
      Id: 34, 
      Price: 33 
     } 
    } 
}; 

pensavo LinqToJS e jquery.map() metodi, ma mi piacerebbe ottenere un metodo più generico possibile. Ho provato questo ma funziona solo al primo livello:

var keys = $.map(o, function(value, key) { 
    if (key == "Price") { 
     return value; 
    } 
}); 
+0

vogliono prezzo di tutti i livelli come un array? come '[10,2,33 ...]' ?? –

risposta

3

è possibile utilizzare una funzione ricorsiva che verifica il tipo di nome della proprietà e il suo tipo. Se il suo nome è Price, aggiungilo a un array. Se si tratta di un oggetto, recurse attraverso quell'oggetto per trovare una chiave Price. Prova questo:

function getPrices(obj, arr) { 
    $.each(obj, function(k, v) { 
     if (k == "Price") 
      arr.push(v); 
     else if (typeof(v) == 'object') 
      getPrices(obj[k], arr); 
    }); 
    return arr; 
} 

var prices = getPrices(o, []); 
console.log(prices); // = [10, 2, 33] 

Working example

+0

è fantastico. Grazie! –

+0

Nessun problema. Non dimenticare di revocare/accettare la risposta se è stata d'aiuto. –

1

È possibile utilizzare jQuery di $.map() per fare questo molto facilmente:

var o = { 
 
    Id: 1, 
 
    Price: 10, 
 
    Attribute: { 
 
    Id: 1, 
 
    Price: 2, 
 
    Modifier: { 
 
     Id: 34, 
 
     Price: 33 
 
    } 
 
    } 
 
}; 
 

 

 
var res = $.map(o, function mapper(obj, key) { 
 
    return key === "Price" ? obj : $.map(obj, mapper) 
 
}); 
 

 

 
document.querySelector("pre").textContent = JSON.stringify(res)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
 
<pre></pre>

questo funziona a causa della caratteristica strana di jQuery di $.map ha dove se si restituisce una matrice dal callback, essa viene appiattita nel risultato.

Pertanto, è possibile chiamare ricorsivamente lo $.map con la stessa funzione su qualsiasi cosa che non sia la chiave Price e l'array restituito verrà semplicemente svuotato nel risultato finale.

È possibile evitare alcune chiamate se si seleziona typeof obj === "object" se lo si desidera.

0

Si potrebbe utilizzare for..in ciclo, ricorsione

var o = { 
 
    Id: 1, 
 
    Price: 10, 
 
    Attribute: { 
 
     Id: 1, 
 
     Price: 2, 
 
     Modifier: { 
 
      Id: 34, 
 
      Price: 33 
 
     } 
 
    } 
 
}; 
 

 
var res = []; 
 

 
(function re(obj) { 
 
for (var prop in obj) { 
 
    if (prop === "Price") { 
 
    res.push(obj[prop]) 
 
    } else { 
 
    re(obj[prop]) 
 
    } 
 
} 
 
}(o)); 
 

 
console.log(res)