簡體   English   中英

Javascript - 如何在包含 arrays 的對象中遍歷對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM