Digamos que tengo un objeto que contiene objetos y matrices:
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 }; Ahora quiero contar cuántas URLs en total contienen los models de objetos. ¿Tendría que contar esto manualmente o hay una manera más fácil?
Además, observe que los objetos no son iguales. Todos ellos contienen diferentes cantidades de objetos y matrices.
Dado que mencionó que la estructura de los datos no es consistente, su tarea sería muy fácil si stringify el objeto y luego busca la palabra clave "url": para obtener un recuento de las URL presentes.
const strigifiedModels = JSON.stringify(models); const count = (strigifiedModels.match(/"url":/g) || []).length;Fragmento de trabajo:
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);Tonterías recursivas:
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));Prueba esto :
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);