2014-02-14 33 views
1

我需要從一個JSON結構在Javascript 我有這個第一檢索信息:如何在Javascript中訪問JSON結構的子對象?

<script type="text/javascript"> 
    var jsonfile= '{"products": 
         {"productInfo1": "test", 
         "productInfo2": "test" } 
        }'; 

    var digitalData = JSON.parse(jsonfile); 
    console.log(digtialData.products.productInfo1); 
    console.log(digtialData.products.productInfo2); 
</script> 

我得到的輸出「測試」在我的控制檯窗口。這工作得很好。但似乎我需要聲明新的對象,以便正確使用。據我所知,他們不喜歡這個解決方案。上述方法將是不好的 。 所以我試圖創建一個新的腳本。

<script type="text/javascript"> 
    var digitalData = new digitalData(); 
    var product = new digitalData.product(); 
    var productInfo1 = new digitalData.product.productInfo1(); 
    var productInfo1 = new digitalData.product.productInfo2(); 
    productInfo1 = "test"; 
    productInfo2 = "test"; 
    console.debug(digitalData.product.productInfo); 
    console.debug(digitalData.product.productInfo); 
</script> 

然後我得到的錯誤:"Uncaught TypeError: undefined is not a function index.php? route=product/product&path=57&product_id=49:265 (anonymous function)"

我嘗試過各種變體,以及濫用谷歌找到答案如何得到這個工作。我找到了一些答案,喜歡讓digitalData.product工作。但我期望獲得第三個對象,並以任何方式將其鏈接到1/2對象(數字數據和產品)。

任何人都有建議如何解決這個問題?

+1

您是否嘗試過像'VAR digitalData = {};'呢? – snollygolly

+1

您還需要將數字數據功能發佈到秒腳本更清晰。 console.debug只有digitalData而不是第二個腳本中的最後兩個console.debugs可以幫助你看到你在做什麼錯誤 – Quad

+0

在你可以用'new digitalData()'創建它之前,你需要一個名爲'digitalData'的函數。 'product'和'productInfo'相同' –

回答

1

不太清楚爲什麼你有第一種方法的問題。但要使用第二種方法,你需要定義你的對象,然後才能new

function DigitalData() { 

} 

var digitalData = new DigitalData(); 

實例化它們然後爲product,你可以做這樣的事情:

function Product() { 

} 

digitalData.product = new Product(); 

但它可能是更容易實際上在構造函數中實例化了DigitalData,否則,構造函數的意義何在?

function DigitalData() { 
     var self = this; 
     self.product = new Product();  
} 

var digitalData = new DigitalData(); 
var product = digitalData.product; 

現在productInfo1和2部分聽起來像它應該是一個數組。所以,你可以做這樣的事情:

function ProductInfo(name) { 
     var self = this; 
     self.name = name; 
} 

function Product(arrayofNames) { 
     var self = this; 
     self.productInfo = arrayofNames.map(function(n) { new ProductInfo(n); }); 
} 

function DigitalData(arrayofNames) { 
    var self = this; 
    self.product = new Product(arrayOfNames); 
} 

var digitalData = new DigitalData({ "product1","product2" }); 

console.log(digitalData.product.productInfo[0].name); // logs "product1" 

但是,如果你不想使用數組,然後:

function Product() { 
     var self = this; 
     self.productInfo1 = new ProductInfo(); 
     self.productInfo2 = new ProductInfo(); 
} 
+0

您的回覆也起作用。但正如我所看到的,用戶Uttam的另一個答覆更短,並且不使用函數。更少的代碼,更好,我猜?但我打算更深入地研究JS中的對象。無論如何感謝您的回覆! :) –

1

首先新關鍵字只是爲function s,在javascript中。那麼如果你這樣做:

var digitalData = new digitalData(); 

這意味着你有一個函數在你的代碼中,你想創建一個基於它的對象。

其次你可以在你的對象所有你內心的對象是這樣的:

digtialData.products 
digtialData["products"] 

和休息:

digtialData.products.productInfo1 
digtialData["products"].productInfo1 
digtialData["products"]["productInfo1"] 

你也可以創建一個類似功能的類,如:

DigitalData = function DigitalData(){ 
    this.products = []; 
}; 
DigitalData.prototype.addProduct = function(info1, info2){ 
    var product = new DigitalData.Product(); 
    product.productInfo1 = info1; 
    product.productInfo2 = info2; 
    this.products.push(product); 
}; 

DigitalData.Product = function Product(info1, info2){ 
    this.productInfo1 = info1; 
    this.productInfo2 = info2; 
}; 
var digitalData = new DigitalData(); 
digitalData.addProduct("test1", "test2"); 
digitalData.addProduct("test11", "test22"); 

var jsonString = JSON.stringify(digitalData); 

console.log(jsonString); 
+0

Hmmz。我不明白。但我打算更深入地研究JS中的對象。無論如何感謝您的回覆! :) –

1

試試這個

var digitalData = new Object(); 
var products = new Object(); 
products.productInfo1 = "test"; 
products.productInfo2 = "test"; 

digitalData.products = products; 

console.debug(digitalData.products.productInfo1); 
console.debug(digitalData.products.productInfo2); 
+0

您的解決方案是工作答案! –

+0

很酷..如果答案滿足您的要求,您可以接受答案.. – Uttam