简体   繁体   English

Javascript - 如何在包含 arrays 的对象中遍历对象?

[英]Javascript - How to loop through objects within objects that also contain arrays?

Let's say I have an object that contains objects as well as 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
};

Now I want to count how many URLs in total the object models contains.现在我想统计 object 个models总共包含多少个URLs Would I have to count this manually, or is there an easier way?我必须手动计算这个,还是有更简单的方法?

Also, notice the objects are not equal.另外,请注意对象不相等。 They all contain different amount of objects & arrays.它们都包含不同数量的对象 & arrays。

Since you mentioned that the structure of the data is not consistent, it would make your task very easy if you stringify the object, and then look for the keyword "url": to get a count of the URLs present.由于您提到数据的结构不一致,如果您对 object 进行stringify ,然后查找关键字"url":以获取当前 URL 的计数,这将使您的任务变得非常容易。

const strigifiedModels = JSON.stringify(models);

const count = (strigifiedModels.match(/"url":/g) || []).length;

Working snippet:工作片段:

 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);

Recursive Nonsense:递归废话:

 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));

Try this :试试这个

 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);

Recursive look up.递归查找。 Just assumes that url will aways be in array of objects.只是假设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