我如何计算具有特定键的所有对象,但如果对象可以嵌套并且我不知道对象的最大深度,因为每次都是不同的?
例如一次可以像这样:
{
"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
}
]
}
其他时间可能有不同的格式。我需要每次都用纪念键来统计所有对象,没有特定的数据结构。
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' 键的出现次数。在调用函数之前不要忘记重置总计数。