2016-03-19 15 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

問題ありません。それが助けられたら、答えをupvote/acceptするのを忘れないでください。 –

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が持つ奇妙な特徴の作品コールバックから配列を返すと、それは配列にフラット化されます結果。

したがって、同じ関数を持つ$.mapを再帰的に呼び出すと、Priceキーでないものに再帰的に呼び出すことができ、返される配列は最終結果に空になります。

ご希望の場合は、typeof obj === "object"にチェックを入れると、一部の通話を避けることができます。あなたはfor..inループを使用することができ

0

、再帰

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)

関連する問題