如何统计具有特定键递归的所有对象?

问题描述 投票:0回答:1

我如何计算具有特定键的所有对象,但如果对象可以嵌套并且我不知道对象的最大深度,因为每次都是不同的?

例如一次可以像这样:

{
    "coins_series": [
        {
            "series": 1,
            "coins": [
                {
                    "_id": "65c8c78845d911984d98f6be",
                    "currency": "EUR",
                    "reverse_id": "SVN200701001REG",
                    "obverse_id": [
                        "EUR199901001FRO"
                    ],
                    "country": "SVN",
                    "commemorative": false,
                    "series": 1,
                    "min_year": 2007,
                    "denomination": 0.01,
                    "diameter": 16.25,
                    "thickness": 1.67,
                    "weight": 2.3
                },
                {
                    "_id": "65c8c78845d911984d98f6bf",
                    "currency": "EUR",
                    "reverse_id": "SVN200701002REG",
                    "obverse_id": [
                        "EUR199901002FRO"
                    ],
                    "country": "SVN",
                    "commemorative": false,
                    "series": 1,
                    "min_year": 2007,
                    "denomination": 0.02,
                    "diameter": 18.75,
                    "thickness": 1.67,
                    "weight": 3.06
                },
                {
                    "_id": "65c8c78845d911984d98f6c0",
                    "currency": "EUR",
                    "reverse_id": "SVN200701005REG",
                    "obverse_id": [
                        "EUR199901005FRO"
                    ],
                    "country": "SVN",
                    "commemorative": false,
                    "series": 1,
                    "min_year": 2007,
                    "denomination": 0.05,
                    "diameter": 21.25,
                    "thickness": 1.67,
                    "weight": 3.92
                },
                {
                    "_id": "65c8c78845d911984d98f6c1",
                    "currency": "EUR",
                    "reverse_id": "SVN200701010REG",
                    "obverse_id": [
                        "EUR200702010FRO"
                    ],
                    "country": "SVN",
                    "commemorative": false,
                    "series": 1,
                    "min_year": 2007,
                    "denomination": 0.1,
                    "diameter": 19.75,
                    "thickness": 1.93,
                    "weight": 4.1
                },
                {
                    "_id": "65c8c78845d911984d98f6c2",
                    "currency": "EUR",
                    "reverse_id": "SVN200701020REG",
                    "obverse_id": [
                        "EUR200702020FRO"
                    ],
                    "country": "SVN",
                    "commemorative": false,
                    "series": 1,
                    "min_year": 2007,
                    "denomination": 0.2,
                    "diameter": 22.25,
                    "thickness": 2.14,
                    "weight": 5.74
                },
                {
                    "_id": "65c8c78845d911984d98f6c3",
                    "currency": "EUR",
                    "reverse_id": "SVN200701050REG",
                    "obverse_id": [
                        "EUR200702050FRO"
                    ],
                    "country": "SVN",
                    "commemorative": false,
                    "series": 1,
                    "min_year": 2007,
                    "denomination": 0.5,
                    "diameter": 24.25,
                    "thickness": 2.38,
                    "weight": 7.8
                },
                {
                    "_id": "65c8c78845d911984d98f6c4",
                    "currency": "EUR",
                    "reverse_id": "SVN200701100REG",
                    "obverse_id": [
                        "EUR200702100FRO"
                    ],
                    "country": "SVN",
                    "commemorative": false,
                    "series": 1,
                    "min_year": 2007,
                    "denomination": 1,
                    "diameter": 23.25,
                    "thickness": 2.33,
                    "weight": 7.5
                },
                {
                    "_id": "65c8c78845d911984d98f6c5",
                    "currency": "EUR",
                    "reverse_id": "SVN200701200REG",
                    "obverse_id": [
                        "EUR200702200FRO"
                    ],
                    "country": "SVN",
                    "commemorative": false,
                    "series": 1,
                    "min_year": 2007,
                    "denomination": 2,
                    "diameter": 25.75,
                    "thickness": 2.2,
                    "weight": 8.5
                }
            ]
        }
    ],
    "country": "SVN"
}

其他时间可以这样:

{
    "series": 2,
    "coins": [
        {
            "_id": "65c8c78845d911984d98f724",
            "currency": "EUR",
            "reverse_id": "VAT200502001REG",
            "obverse_id": [
                "EUR199901001FRO"
            ],
            "country": "VAT",
            "commemorative": false,
            "series": 2,
            "min_year": 2005,
            "max_year": 2005,
            "denomination": 0.01,
            "diameter": 16.25,
            "thickness": 1.67,
            "weight": 2.3
        },
        {
            "_id": "65c8c78845d911984d98f725",
            "currency": "EUR",
            "reverse_id": "VAT200502002REG",
            "obverse_id": [
                "EUR199901002FRO"
            ],
            "country": "VAT",
            "commemorative": false,
            "series": 2,
            "min_year": 2005,
            "max_year": 2005,
            "denomination": 0.02,
            "diameter": 18.75,
            "thickness": 1.67,
            "weight": 3.06
        },
        {
            "_id": "65c8c78845d911984d98f726",
            "currency": "EUR",
            "reverse_id": "VAT200502005REG",
            "obverse_id": [
                "EUR199901005FRO"
            ],
            "country": "VAT",
            "commemorative": false,
            "series": 2,
            "min_year": 2005,
            "max_year": 2005,
            "denomination": 0.05,
            "diameter": 21.25,
            "thickness": 1.67,
            "weight": 3.92
        },
        {
            "_id": "65c8c78845d911984d98f727",
            "currency": "EUR",
            "reverse_id": "VAT200502010REG",
            "obverse_id": [
                "EUR199901010FRO"
            ],
            "country": "VAT",
            "commemorative": false,
            "series": 2,
            "min_year": 2005,
            "max_year": 2005,
            "denomination": 0.1,
            "diameter": 19.75,
            "thickness": 1.93,
            "weight": 4.1
        },
        {
            "_id": "65c8c78845d911984d98f728",
            "currency": "EUR",
            "reverse_id": "VAT200502020REG",
            "obverse_id": [
                "EUR199901020FRO"
            ],
            "country": "VAT",
            "commemorative": false,
            "series": 2,
            "min_year": 2005,
            "max_year": 2005,
            "denomination": 0.2,
            "diameter": 22.25,
            "thickness": 2.14,
            "weight": 5.74
        },
        {
            "_id": "65c8c78845d911984d98f729",
            "currency": "EUR",
            "reverse_id": "VAT200502050REG",
            "obverse_id": [
                "EUR199901050FRO"
            ],
            "country": "VAT",
            "commemorative": false,
            "series": 2,
            "min_year": 2005,
            "max_year": 2005,
            "denomination": 0.5,
            "diameter": 24.25,
            "thickness": 2.38,
            "weight": 7.8
        },
        {
            "_id": "65c8c78845d911984d98f72a",
            "currency": "EUR",
            "reverse_id": "VAT200502100REG",
            "obverse_id": [
                "EUR199901100FRO"
            ],
            "country": "VAT",
            "commemorative": false,
            "series": 2,
            "min_year": 2005,
            "max_year": 2005,
            "denomination": 1,
            "diameter": 23.25,
            "thickness": 2.33,
            "weight": 7.5
        },
        {
            "_id": "65c8c78845d911984d98f72b",
            "currency": "EUR",
            "reverse_id": "VAT200502200REG",
            "obverse_id": [
                "EUR199901200FRO"
            ],
            "country": "VAT",
            "commemorative": false,
            "series": 2,
            "min_year": 2005,
            "max_year": 2005,
            "denomination": 2,
            "diameter": 25.75,
            "thickness": 2.2,
            "weight": 8.5
        }
    ]
}

其他时间可能有不同的格式。我需要每次都用纪念键来统计所有对象,没有特定的数据结构。

javascript javascript-objects
1个回答
0
投票
let totalCount=0;
const countFinder = (obj,key ='commemorative',val=undefined) =>{
  if(Array.isArray(obj)){
    for(let item of obj){
      countFinder(item,key,val);
    }
  }
  else if(typeof obj === 'object'){
    if(Object.prototype.hasOwnProperty.call(obj,key)){
      if(val!==undefined){
        if(obj[key] === val){
          totalCount++;
          return;
        }
        return
      }
      else{
        totalCount++;
        return;
      }
    }
    else{
      for(let _key in obj){
        let item = obj[_key];
        countFinder(item,key,val);
      }
    }
  }
  else{
    return;
  }
  return totalCount
}

此函数返回给定对象或数组中指定键的计数。例如,当调用 count Finder(obj, 'commemorative') 时,它将迭代第一个对象中的所有元素以搜索 'commemorative' 键。如果调用 count Finder(obj, 'commemorative', true),它将计算值为 true 的 'commemorative' 键的出现次数。在调用函数之前不要忘记重置总计数。

© www.soinside.com 2019 - 2024. All rights reserved.