如何访问JSON对象的子项?

时间:2017-11-04 16:26:29

标签: javascript jquery html json

好吧,我有这个JSON文件

{
"status": "success",
"message": {
    "affenpinscher": [],
    "african": [],
    "airedale": [],
    "corgi": [
        "cardigan"
    ],
    "akita": [],
    "appenzeller": [],
    "basenji": [],
    "beagle": [],
    "bluetick": [],
    "borzoi": [],
    "bouvier": [],
    "boxer": [],
    "brabancon": [],
    "briard": [],
    "bulldog": [
        "boston",
        "french"
    ]
  }
}

我需要遍历列表并检查品种的数组是否为空。

我过去曾使用过JSON文件,但这些列表通常都在某种形式的Arraylist中,这让我可以简单地遍历它,但我不确定我是什么应该在这种情况下做。

有没有办法选择所有"孩子"消息。

这是我到目前为止所做的。

$.getJSON("https://dog.ceo/api/breeds/list/all", function (resp) {
    var doglist = $('#doglist');
    $.each(resp.message, function(dog) {
        var dog1 = resp.message;
        doglist.append('<li>' + dog + '</li>')
        var subdog = Object.keys(dog1).length;
        console.log(subdog);        
    });
});

我可能不够清楚。

在我的代码段中,有一个

var subdog = Object.keys(dog1).length; 

按预期返回15。

我需要的是做一些像

这样的事情
var subdog = Object.keys(dog1.bulldog).length;

并让它返回2

但它需要自动完成所有品种。

基本上循环遍历列表

8 个答案:

答案 0 :(得分:4)

试试这个

$.each(resp.message, function(index, dogs) {
    var subdog = dogs.length;
    console.log(subdog);        
});

答案 1 :(得分:3)

您可以使用Object.values()获取对象值的数组,并使用.map()返回每个数组的.length,该数组是对象中属性的值

let o = {"status":"success","message":{"affenpinscher":[],"african":[],"airedale":[],"corgi":["cardigan"],"akita":[],"appenzeller":[],"basenji":[],"beagle":[],"bluetick":[],"borzoi":[],"bouvier":[],"boxer":[],"brabancon":[],"briard":[],"bulldog":["boston","french"]}};

let len = Object.values(o.message).map(({length}) => length);

console.log(len);

答案 2 :(得分:1)

您可以使用方括号语法来获取值。

Object.keys(dog1).forEach((dog) => {
    console.log(key) // Will log `bulldog` etc.
    console.log(dog[key].length); // Will log 2, etc. 
});

有关详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Bracket_notation

答案 3 :(得分:1)

这样做:

var subdog = Object.keys(dog1).map(dog => dog1[dog].length);

然后,subdog将包含每个品种的长度数组。

答案 4 :(得分:0)

您可以通过循环访问对象并使用键for(let key of myObject)来访问该值,然后通过方括号访问它,就像使用数组一样。

&#13;
&#13;
let dogs = {
  "status": "success",
  "message": {
    "affenpinscher": [],
    "african": [],
    "airedale": [],
    "corgi": [
      "cardigan"
    ],
    "akita": [],
    "appenzeller": [],
    "basenji": [],
    "beagle": [],
    "bluetick": [],
    "borzoi": [],
    "bouvier": [],
    "boxer": [],
    "brabancon": [],
    "briard": [],
    "bulldog": [
      "boston",
      "french"
    ]
  }
}

for (let key in dogs.message) {
  if (Array.isArray(dogs.message[key]) && dogs.message[key].length > 0) {
    // Do something here
    dogs.message[key].forEach(d => console.log(d))
  }
}
&#13;
&#13;
&#13;

答案 5 :(得分:0)

users : {
    byId : {},
    allIds : []
}

希望这有效

答案 6 :(得分:0)

如果您希望每个品种分开而不是总计只需将其更改为

,我会重新阅读该问题
  for(var i=0; i<dog1.length;i++){
    subDog[i] = dog1[i].length;
  });

答案 7 :(得分:0)

我认为你需要编程递归。并且没有 jquery 需要

这是一个示例对象和您的对象

let testObj = {
    lala0: {
        lala1: {
            a: "1"
        },
        foo1: {
            b: "2"
        },
        doo1: {
            c: "3"
        }
    },
    foo0: {
        d: "4"
    },
    doo0: {
        lala1: {
            lala2: {
                e: "5"
            },
            foo2: {
                f: "6"
            },
            doo2: {
                g: "7"
            }
        },
        foo1: {
            lala2: {
                h: "8"
            },
            foo2: {
                i: "9"
            },
            doo2: {
                j: "10"
            }
        },
        doo1: {
            lala2: {
                k: "11"
            },
            foo2: {
                l: "12",
                m: "13"
            },
            doo2: {
                n: "14"
            }
        }
    }
},
dogs = {
"status": "success",
"message": {
    "affenpinscher": [],
    "african": [],
    "airedale": [],
    "corgi": [
        "cardigan"
    ],
    "akita": [],
    "appenzeller": [],
    "basenji": [],
    "beagle": [],
    "bluetick": [],
    "borzoi": [],
    "bouvier": [],
    "boxer": [],
    "brabancon": [],
    "briard": [],
    "bulldog": [
        "boston",
        "french"
    ]
  }
}

function isObject(target) {
    return typeof(target) == "object";
}

function Recursive(obj, i = "") {
    for (let key in obj)
        if (obj.hasOwnProperty(key))
            if (isObject(obj)) {
                value = obj[key];
                if (value == "[object Object]")
                    value = "object";
                console.log(i + key + ": " + value);
                Recursive(obj[key], i + "----|");
            }
}


Recursive(testObj);
console.log("NEW OBJECT!")
Recursive(dogs);

用以下代码重写dog变量:

let dogs = readJsonFromUrl('http://your.site.com/v1/jsons/...');