2016-03-19 13 views
7

Mam obiekt w poniższym formacie i potrzebuję uzyskać wszystkie wartości z właściwości Price na wszystkich poziomach obiektu.Uzyskaj wartości według nazwy właściwości z obiektu na różnych poziomach.

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

Myślałam o LinqToJS i jquery.map() metod, ale chciałbym dostać metodę jako rodzajowy, jak to możliwe. Próbowałem tego, ale to działa tylko na pierwszym poziomie:

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

chcą cenę wszystkich poziomach jako tablica? jak '[10,2,33 ...]' ?? –

Odpowiedz

3

Można użyć funkcji rekurencyjnej, który sprawdza typ nazwy obiektu i jego typu. Jeśli jego nazwa to Price, dodaj ją do tablicy. Jeśli jest to obiekt, przejdź przez ten obiekt, aby znaleźć klucz Price. Spróbuj tego:

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

to świetnie. dzięki! –

+0

Bez problemu. Nie zapomnij o przejęciu/zaakceptowaniu odpowiedzi, jeśli to pomogło. –

1

Można użyć jQuery $.map() to zrobić bardzo łatwo:

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>

To działa z powodu nieparzystej funkcji jQuery $.map ma gdzie jeśli zwrócisz Array z wywołania zwrotnego, zostanie spłaszczony do wynik.

Dlatego możemy wywołać rekurencyjnie $.map z tą samą funkcją na czymkolwiek, co nie jest kluczem Price, a zwrócona tablica zostanie po prostu opróżniona do końcowego wyniku.

Jeśli chcesz, możesz ominąć niektóre połączenia, jeśli sprawdzisz numer typeof obj === "object".

0

Można użyć for..in pętlę, rekurencja

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)