2016-03-19 4 views
7

Ich habe ein Objekt im folgenden Format und ich muss alle Werte aus der Price -Eigenschaft auf allen Ebenen des Objekts abrufen.Abrufen von Werten nach Eigenschaftsname von einem Objekt auf verschiedenen Ebenen

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

Ich dachte an LinqToJS und jquery.map() Methoden, aber ich möchte ein Verfahren so allgemein wie möglich erhalten. Ich habe versucht, dies aber es funktioniert nur auf der ersten Ebene:

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

wollen Preis aller Ebenen als ein Array? wie '[10,2,33 ...]' ?? –

Antwort

3

Sie können eine rekursive Funktion benutzen, die die Art des Namen der Eigenschaft und seine Art prüft. Wenn der Name Price lautet, fügen Sie ihn zu einem Array hinzu. Wenn es sich um ein Objekt handelt, durchforsten Sie dieses Objekt, um einen Schlüssel Price zu finden. Versuchen Sie folgendes:

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

das ist großartig. Vielen Dank! –

+0

Kein Problem. Vergiss nicht, die Antwort zu bestätigen/zu akzeptieren, wenn es geholfen hat. –

1

Sie jQuery verwenden können $.map() dies zu tun sehr leicht:

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>

Dies wegen der ungeraden Funktion funktioniert $.map jQuery hat, wo Wenn Sie ein Array aus dem Callback zurückgeben, wird es in den Ergebnis.

Daher können wir rekursiv $.map mit der gleichen Funktion auf alles, was nicht der Price Schlüssel ist, anrufen, und das Array, das es zurückgibt, wird nur in das Endergebnis geleert werden.

Sie können einige Anrufe vermeiden, wenn Sie auf Wunsch typeof obj === "object" überprüfen.

0

Sie for..in Schleife verwenden könnte, Rekursion

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)

Verwandte Themen