简体   繁体   中英

Count number of all specific keys (or values) in json object/array- JavaScript/Angular?

I have large nested json object like this, and I want to count the number of pets in the whole object. How can achieve that? I've tired Object.keys(obj[0]).length but not successful of the desired result. Also how can I go deeper into array for counting for example some nested value like color in pet ?

What is the good tutorial for working with multi level arrays in JavaScript or Angular?

obj = [
 {
        "person": {
          "name": "a",
        },
        "pet": {
          "name": "1"
        }
      },

      {
        "person": {
          "name": "b",
        },
        "pet": {
          "name": "2",
          "color": "black",
          }
        },

      {
        "person": {
          "name": "c",
        },
        "pet": {
          "name": "3",
          "color": "red",
          }
        }
]

Filter the array with pet property and pet's color property and perform array count.

 let obj = [ { "person": { "name": "a", }, "pet": { "name": "1" } }, { "person": { "name": "b", }, "pet": { "name": "2", "color": "black", } }, { "person": { "name": "c", }, "pet": { "name": "3", "color": "red", } } ]; let petItemCount = obj.filter(x => x["pet"]).length; console.log(petItemCount); let petItemWithColorCount = obj.filter(x => x["pet"] && x["pet"]["color"]).length; console.log(petItemWithColorCount);

In case the pet value is possibly null or pet's color is possibly null,

let petItemCount = obj.filter(x => x["pet"] != undefined).length;
console.log(petItemCount);

let petItemWithColorCount = obj.filter(x => x["pet"] && x["pet"]["color"] != undefined).length;
console.log(petItemWithColorCount);
let pets = 0;
obj.map( item => {
  if(item.pet) {
    pets += 1;
  }
})

Sounds like reducing would be a fit:

colors = obj.reduce(
 (sum, { pet }) => pet.color !== undefined ? ++sum : sum, 
0)); // -> initial count value

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM