2010-11-23 18 views
274

Ben görünen bir javascript nesne varsa gibi geçirilir bir işlev hem nesnesi ve böyleceJavaScript nesnesi: dize olarak adıyla erişim değişken özellik

gibi bir özellik adına sahip

var columns = { 
    left: true, 
    center : false, 
    right : false 
} 

altında ve

//should return false 
var side = read_prop(columns, 'right'); 

read_prop(object, property) gövdesi nasıl olurdu?

+14

yinelenen, ancak görünüşe göre bu 'iyi' bir soru (soru-cevap hem de daha oy) orijinal yerine, kesinlikle tabloları kaç – BlackTigerX

+0

@BlackTigerX yerine 'özgün' sorusu, Google üzerinden buldum olduğunu –

+1

@PatrickRoberts döndü oh evet, muhtemelen bu sorunun diğer soruya yardımcı olması yardımcı oldu, ben hala soruda biraz farklı bir başlığa sahip olmanın faydasını görüyorum (dize adıyla özellik) – BlackTigerX

cevap

517

Bunun için bir işlev gerek yoktur - sadece kullanım bracket notation:

var side = columns['right']; 

Bu right da değişken, fonksiyon dönüş değeri gelebilir gerçeği dışında, dot notation, var side = columns.right; eşittir, vb. parantez gösterim kullanıldığında. bunun için bir işlev İHTİYACINIZ Eğer

, işte burada:

Yukarıda cevap (Ben yinelenen soru soruldu ve burada sevk edildi) tarafından Projemle yardımcı beri
function read_prop(obj, prop) { 
    return obj[prop]; 
} 
+9

Belki bu söylemeye gerek yok, ama ben açık bir şekilde 'prop' 'string' tipinde olmalı ya da' string 'yazacak şekilde çözülmeye değeceğini düşünün. – prasanthv

+1

IMHO oldukça açık ... – ThiefMaster

+7

ve iç içe geçmiş nesneler nelerdir? – sarkiroka

5

, bir göndererek ediyorum

<html> 
 
<head> 
 
    <script type="text/javascript"> 
 
    function displayFile(whatOption, whatColor) { 
 
     var Test01 = { 
 
     rectangle: { 
 
      red: "RectangleRedFile", 
 
      blue: "RectangleBlueFile" 
 
     }, 
 
     square: { 
 
      red: "SquareRedFile", 
 
      blue: "SquareBlueFile" 
 
     } 
 
     }; 
 
     var filename = Test01[whatOption][whatColor]; 
 
     alert(filename); 
 
    } 
 
    </script> 
 
</head> 
 
<body> 
 
    <p onclick="displayFile('rectangle', 'red')">[ Rec Red ]</p> 
 
    <br/> 
 
    <p onclick="displayFile('square', 'blue')">[ Sq Blue ]</p> 
 
    <br/> 
 
    <p onclick="displayFile('square', 'red')">[ Sq Red ]</p> 
 
</body> 
 
</html>

55

ThiefMaster yanıtıdır: var içinde, yerleştirme sırasında ayraç için (benim test kodu) cevap 100% doğru (upvoted!), Benzer bir probleme rastladığım halde, iç içe geçmiş bir nesneden (bir nesnenin içindeki nesne) bir mülk almam gerekti, bu yüzden onun cevabına bir alternatif olarak, cevabına bir alternatif olarak, izin verecek bir özyinelemeli çözüm yaratabilirsiniz. Eğer derinlik ne olursa olsun, herhangi bir özelliğini kapmak için bir terminolojiyi tanımlamak için:

function fetchFromObject(obj, prop) { 

    if(typeof obj === 'undefined') { 
     return false; 
    } 

    var _index = prop.indexOf('.') 
    if(_index > -1) { 
     return fetchFromObject(obj[prop.substring(0, _index)], prop.substr(_index + 1)); 
    } 

    return obj[prop]; 
} 

belirli bir özelliğine dize referansı property1.property2

Kodu ve JsFiddle yorumların ressembles nerede.

+1

Eğer prop 'dizisi dizi dizinleri içerecekse bu işe yaramaz – SET

+3

Bunun gibi mi? http: // jsfiddle.net/amofb8xa/8/ – Prusprus

+2

Bu özellikle, özellikle "controllerAs" sözdizimi ile çalışırken, Angular'deki belirli durumlarda çok güçlü bir şeydir, çünkü "controllerAs", "Tanımladığınız diğer adla" $ scope "üzerinde bir özellik oluşturun. “İç içe geçmiş bir özelliğe ulaşmak için kapsamı taramak zorunda kalıyorsunuz.” –

İlgili konular