[英]Javascript - How to loop through objects within objects that also contain arrays?
假設我有一個包含對象的 object 以及 arrays --
const models = {
characters: {
human: {
male: {
short: [
{ url: 'resources/models/characters/human/male/short/male0.fbx' },
],
tall: [
{ url: 'resources/models/characters/human/male/tall/male0.fbx' },
]
},
female: [
{ url: 'resources/models/characters/human/female/female0.fbx' },
{ url: 'resources/models/characters/human/female/female0.fbx' },
],
},
orc: {
male: [
],
female: [
],
}
},
objects: {
floors: {
wood: [
{ url: 'resources/models/objects/floors/wood/floor_wood_000.obj' },
{ url: 'resources/models/objects/floors/wood/floor_wood_001.obj' },
{ url: 'resources/models/objects/floors/wood/floor_wood_002.obj' },
{ url: 'resources/models/objects/floors/wood/floor_wood_003.obj' }
],
},
walls: {
wood: [
],
},
stairs: {
wood: [
],
},
bed: [
{ url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' },
{ url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' }
],
}
};
var count = {
characters: numberOfUrlsInCharacters,
objects: numberofUrlsInObjects
};
現在我想統計 object 個models
總共包含多少個URLs
。 我必須手動計算這個,還是有更簡單的方法?
另外,請注意對象不相等。 它們都包含不同數量的對象 & arrays。
由於您提到數據的結構不一致,如果您對 object 進行stringify
,然后查找關鍵字"url":
以獲取當前 URL 的計數,這將使您的任務變得非常容易。
const strigifiedModels = JSON.stringify(models);
const count = (strigifiedModels.match(/"url":/g) || []).length;
工作片段:
const models = { characters: { human: { male: { short: [{ url: 'resources/models/characters/human/male/short/male0.fbx' }, ], tall: [{ url: 'resources/models/characters/human/male/tall/male0.fbx' }, ], female: [{ url: 'resources/models/characters/human/female/female0.fbx' }, { url: 'resources/models/characters/human/female/female0.fbx' }, ], }, orc: { male: [], female: [], }, }, objects: { floors: { wood: [{ url: 'resources/models/objects/floors/wood/floor_wood_000.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_001.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_002.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_003.obj' }, ], }, walls: { wood: [], }, stairs: { wood: [], }, bed: [{ url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' }, { url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' }, ], }, }, }; const strigifiedModels = JSON.stringify(models); const count = (strigifiedModels.match(/"url":/g) || []).length; console.log(count);
遞歸廢話:
const models = { characters: { human: { male: { short: [ { url: 'resources/models/characters/human/male/short/male0.fbx' }, ], tall: [ { url: 'resources/models/characters/human/male/tall/male0.fbx' }, ] }, female: [ { url: 'resources/models/characters/human/female/female0.fbx' }, { url: 'resources/models/characters/human/female/female0.fbx' }, ], }, orc: { male: [ ], female: [ ], } }, objects: { floors: { wood: [ { url: 'resources/models/objects/floors/wood/floor_wood_000.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_001.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_002.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_003.obj' } ], }, walls: { wood: [ ], }, stairs: { wood: [ ], }, bed: [ { url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' }, { url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' } ], } }; const countUrls = (thing) => { let count = 0; if (Array.isArray(thing)) { count += thing.reduce((acc, el) => acc + countUrls(el), 0); } else if (typeof thing === "object") { if (thing.url) { count++; } else { count += Object.values(thing).reduce((acc, el) => acc + countUrls(el), 0); } } return count; }; console.log(countUrls(models)); console.log(countUrls(models.characters.human));
試試這個:
const models = { characters: { human: { male: { short: [ { url: 'resources/models/characters/human/male/short/male0.fbx' }, ], tall: [ { url: 'resources/models/characters/human/male/tall/male0.fbx' }, ] }, female: [ { url: 'resources/models/characters/human/female/female0.fbx' }, { url: 'resources/models/characters/human/female/female0.fbx' }, ], }, orc: { male: [ ], female: [ ], } }, objects: { floors: { wood: [ { url: 'resources/models/objects/floors/wood/floor_wood_000.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_001.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_002.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_003.obj' } ], }, walls: { wood: [ ], }, stairs: { wood: [ ], }, bed: [ { url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' }, { url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' } ], } }; const numberOfUrlsInCharacters = JSON.stringify(models.characters).match(/"url":/ig).length; const numberofUrlsInObjects = JSON.stringify(models.objects).match(/"url":/ig).length; var count = { characters: numberOfUrlsInCharacters, objects: numberofUrlsInObjects }; console.log(count);
遞歸查找。 只是假設url
將位於對象數組中。
const models = { characters: { human: { male: { short: [{ url: 'resources/models/characters/human/male/short/male0.fbx' }, ], tall: [{ url: 'resources/models/characters/human/male/tall/male0.fbx' }, ] }, female: [{ url: 'resources/models/characters/human/female/female0.fbx' }, { url: 'resources/models/characters/human/female/female0.fbx' }, ], }, orc: { male: [ ], female: [ ], } }, objects: { floors: { wood: [{ url: 'resources/models/objects/floors/wood/floor_wood_000.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_001.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_002.obj' }, { url: 'resources/models/objects/floors/wood/floor_wood_003.obj' } ], }, walls: { wood: [ ], }, stairs: { wood: [ ], }, bed: [{ url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' }, { url: 'resources/models/objects/bed/objects_bed_mattress_000.obj' } ], } }; const countUrls = (item) => { if (Array.isArray(item)) { return item.reduce((c, x) => x.url? c + 1: c, 0); } else { return Object.values(item).reduce((cnt, x) => cnt + countUrls(x), 0); } } const result = Object.entries(models).reduce((acc, [key, obj]) => { acc[key] = countUrls(obj); return acc; }, {}); console.log(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.