2016-03-19 22 views
7

Aşağıdaki biçimde bir nesneyim var ve Price özelliğinden tüm değerleri nesnenin tüm düzeylerinde almam gerekiyor.Farklı düzeylerde bir nesneden özellik adına göre değerler edin

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

Ben LinqToJS ve jquery.map() yöntemlerinin düşünüyordum ama mümkün olduğu kadar genel bir yöntemi almak istiyorum. Bu çalıştı ama sadece ilk düzeyde çalışır:

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

bir dizi olarak her düzeyde fiyatını istiyor? gibi [10,2,33 ...] '?? –

cevap

3

Sen mülkiyet ve türünün adının türünü test eden bir özyinelemeli işlevini kullanabilirsiniz. Adı Price ise, bir diziye ekleyin. Bir nesne ise, Price anahtarını bulmak için bu nesneyi yineleyin. Bu deneyin:

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

bu harika. Teşekkürler! –

+0

Sorun değil. Yardım ederse cevabı kabul etmeyi/kabul etmeyi unutmayın. –

1

Çok kolay yapacak jQuery en $.map() kullanabilirsiniz:

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>

Bunun nedeni jQuery en $.map sahiptir garip özelliği çalışır Bir Diziyi geri aramadan döndürürseniz, düzleştirilir. sonucu.

Bu nedenle, $.map numaralı özeti yinelemeli olarak Price anahtarında olmayan aynı işlevle çağırabiliriz ve döndürdüğü dizi yalnızca son sonuca boşaltılacaktır.

İsterseniz, typeof obj === "object" numaralı telefonu kontrol ederseniz, bazı çağrıları engelleyebilirsiniz. Sen for..in döngü kullanabilirsiniz

0

, tekrarlama

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)

İlgili konular