如何在Javascript中访问JSON结构的子对象?

时间:2014-02-14 14:33:28

标签: javascript json object

我需要从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>

我在控制台窗口中输出“test”。这很好。但似乎我需要声明新对象,以便正确使用。据我了解,他们不喜欢这个解决方案。上述方法很糟糕 。 所以我尝试创建一个新脚本。

<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对象(digitalData和product)。

任何人都有建议如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

首先,javascript中的新关键字仅适用于function s。如果你这样做:

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);

答案 1 :(得分: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);

答案 2 :(得分: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();
 }