2016-03-19 130 views
7

我有一個下面的格式的對象,我需要從該對象的所有級別的Price屬性中獲取所有值。從不同級別的對象獲取屬性名稱的值

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

我想LinqToJS和jquery.map()方法,但我想獲得的方法儘可能地通用。我試過這個,但它只能在第一級工作:

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

希望各級爲陣列的價格是多少?像'[10,2,33 ...]'?? –

回答

3

您可以使用遞歸函數來測試屬性的名稱類型及其類型。如果它的名字是Price,請將其添加到數組中。如果它是一個對象,則通過該對象遞歸找到一個Price鍵。試試這個:

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

很好。謝謝! –

+0

沒問題。如果有幫助,不要忘記加註/接受答案。 –

1

您可以使用jQuery的$.map()要做到這一點很容易:

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>

這工作,因爲奇數功能jQuery的$.map具有這樣的如果你從回調中返回一個數組,它會變成平鋪的結果。

因此,我們可以在任何不是Price鍵的情況下遞歸調用$.map,它的返回數組只會被清空到最終結果中。

如果您願意檢查typeof obj === "object",您可以避開一些電話。

0

你可以使用for..in循環,遞歸

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)