2014-02-14 29 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