【问题标题】:Check JSON if has nested object [duplicate]检查 JSON 是否有嵌套对象 [重复]
【发布时间】:2014-08-22 04:14:57
【问题描述】:

如何检查我的 JSON 中是否存在 subproducts 对象?

"products":[
    {
    "id":5002,
    "description":"i dont know",
    "position":1,
    "weight":1,
    "subproducts":{
            "name":"test",
            "description":"description of test"
        }
    }
],

每当我使用 if(product.subproducts)product.subproduct.name 时,它都会让我返回 true,它们无法读取未定义的名称属性。

$.each(company.products, function (j, product) {
    if(product.hasOwnProperty('subproducts') {
       //do something        
    } else {
      // do this
    }
}

更新:忘了说,对于每个产品,是否包含子产品。

【问题讨论】:

  • 当你记录typeof(products.subproducts);的输出时你会得到什么?
  • 它给了我未定义的。
  • “每当我使用 if(product.subproducts)product.subproduct.name 时,它都会让我返回 true,它们无法读取未定义的名称属性。” 如果代码为抛出错误?
  • 您确实意识到product.subproductsproduct.subproduct 不同?访问product.subproduct.name 是非常错误的。
  • 您有一个包含对象数组的对象。所以products.subproducts不对,应该是products[0].subproducts

标签: javascript json


【解决方案1】:

我认为你应该试试这个:

products[0].hasOwnProperty('subproducts')

【讨论】:

  • 你是对的。 Products 是一个对象数组。 OP 必须迭代以检查每个对象的子产品密钥。
  • OP 已经在这样做了:if(product.hasOwnProperty('subproducts') {
【解决方案2】:

似乎当您说子产品不存在时,它确实作为对象存在,但没有属性。一个没有属性的对象在 JavaScript 中仍然被认为是真实的,所以这就是为什么它总是通过你的真实条件,然后如果你尝试访问 name 属性时抛出未定义的错误。

例子:

var obj = {};
console.log(obj ? true : false); // true

在这种情况下,您可以测试现有的name

$.each(company.products, function (j, product) {
    if(product.hasOwnProperty('subproducts') {
       if(product.subproducts.name){
           // it has subproducts AND the subproduct.name exists
       }     
    } else {
      // do this
    }
}

【讨论】:

    【解决方案3】:

    最好的办法是检查对象并检查对象:

    function hasSubObject(products) {
        for(var key in products){
            if(!products.hasOwnProperty(key))continue;
            if(typeof products[key] === "object") return true;
        }
        return false;
    }
    

    如果你有大物体,这很恶心,可能会减慢速度

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 2020-02-03
      • 2022-01-16
      • 2017-08-08
      • 2018-12-23
      • 2020-04-27
      • 2022-06-30
      • 2018-02-24
      • 2015-11-10
      相关资源
      最近更新 更多