Итерирование объекта Json и сохранение конечного результата - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь выполнить итерацию объекта JSON, который представляет собой массив категорий. Категории могут иметь или не иметь подкатегорию.

Если hasSubcategory = false, тогда идентификатор категории должен быть сохранен в окончательном массиве.

Если hasSubcategory = true, он должен повторяться, пока подкатегория не станет hasSubcategory = false и сохранить идентификатор в окончательный массив.

Существует поле parentId для представления родительской категории категории. Более важно, что могут быть подкатегории для одной подкатегории

Конечный массив должен иметь идентификатор категории только с hasSubcategory = false.

Для следующего примера конечный массив должен быть [2,3,5,6]

[
    {
        "_id": "1",
        "name": "DESKTOP COMPUTERS",
        "hasSubCategory": "true",
        "parentId": "0"
    },
    {
        "_id": "2",
        "name": "LAPTOP COMPUTERS",
        "hasSubCategory": "false",
        "parentId": "1"
    },
    {
        "_id": "3",
        "name": "MONITORS",
        "hasSubCategory": "false",
        "parentId": "2"
    },
    {
        "_id": "4",
        "name": "INPUT DEVICES",
        "hasSubCategory": "true",
        "parentId": "0"
    },
    {
        "_id": "5",
        "name": "PRINTERS SCANNERS",
        "hasSubCategory": "true",
        "parentId": "4"
    },
    {
        "_id": "6",
        "name": "ACCESSORIES",
        "hasSubCategory": "false",
        "parentId": "4"
    },
    {
        "_id": "7",
        "name": "ACCESSORIES",
        "hasSubCategory": "false",
        "parentId": "5"
    },
     {
        "_id": "8",
        "name": "ACCESSORIES",
        "hasSubCategory": "false",
        "parentId": "5"
    },
]

То, что я пробовал, но я не смог продолжить

async function recursiveFunction(subCategory)
    {
        if(subCategory.length == 0)
        {
            return 1;
        }
        for(i=0;i<subCategory.length;i++)
        {
            if(subCategory[i].hasSubCategory === 'true' )
            {
                // subCategory = subCategory[i];
                subCategory[i]  = await mongodb.findAll({parentId:new objectid (category._id)});
                recursiveFunction(subCategory[i])
            }
            else
            {
                finalCategories.push(subCategory[i])
            }
        }

    }

    category  = await mongodb.findOne({_id:new objectid (request.params.id)});
    if(category.hasSubCategory === 'true')
    {
    subCategory  = await mongodb.findAll({parentId:new objectid (category._id)});
    // await recursiveFunction(subCategory)
    }
    else
    {
        console.log(category)
    }
    console.log(finalCategories)

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

Я бы посоветовал связать фильтр + карта методы:

const arr = [
    {
        "_id": "1",
        "name": "DESKTOP COMPUTERS",
        "hasSubCategory": "true",
        "parentId": "0"
    },
    {
        "_id": "2",
        "name": "LAPTOP COMPUTERS",
        "hasSubCategory": "false",
        "parentId": "1"
    },
    {
        "_id": "3",
        "name": "MONITORS",
        "hasSubCategory": "false",
        "parentId": "2"
    },
    {
        "_id": "4",
        "name": "INPUT DEVICES",
        "hasSubCategory": "true",
        "parentId": "0"
    },
    {
        "_id": "5",
        "name": "PRINTERS SCANNERS",
        "hasSubCategory": "false",
        "parentId": "4"
    },
    {
        "_id": "6",
        "name": "ACCESSORIES",
        "hasSubCategory": "false",
        "parentId": "4"
    },
];

const result = arr.filter(el => el.hasSubCategory === 'false').map(el => el._id);

console.log(result);
0 голосов
/ 01 июля 2019

Это действительно просто - просто используйте filter, чтобы извлечь элементы с hasSubCategory из false, затем map из _id:

const arr = [{"_id":"1","name":"DESKTOP COMPUTERS","hasSubCategory":"true","parentId":"0"},{"_id":"2","name":"LAPTOP COMPUTERS","hasSubCategory":"false","parentId":"1"},{"_id":"3","name":"MONITORS","hasSubCategory":"false","parentId":"2"},{"_id":"4","name":"INPUT DEVICES","hasSubCategory":"true","parentId":"0"},{"_id":"5","name":"PRINTERS SCANNERS","hasSubCategory":"false","parentId":"4"},{"_id":"6","name":"ACCESSORIES","hasSubCategory":"false","parentId":"4"}];
const res = arr.filter(({ hasSubCategory }) => hasSubCategory == "false").map(({ _id }) => _id);
console.log(res);

Для более эффективного решения используйте reduce:

const arr = [{"_id":"1","name":"DESKTOP COMPUTERS","hasSubCategory":"true","parentId":"0"},{"_id":"2","name":"LAPTOP COMPUTERS","hasSubCategory":"false","parentId":"1"},{"_id":"3","name":"MONITORS","hasSubCategory":"false","parentId":"2"},{"_id":"4","name":"INPUT DEVICES","hasSubCategory":"true","parentId":"0"},{"_id":"5","name":"PRINTERS SCANNERS","hasSubCategory":"false","parentId":"4"},{"_id":"6","name":"ACCESSORIES","hasSubCategory":"false","parentId":"4"}];
const res = arr.reduce((a, { hasSubCategory, _id }) => (hasSubCategory == "false" ? a.push(_id) : a, a), []);
console.log(res);
0 голосов
/ 01 июля 2019

Filter сначала, чтобы получить нужные вам объекты, затем map их в нужный вам шаблон.

let arr = [{"_id":"1","name":"DESKTOP COMPUTERS","hasSubCategory":"true","parentId":"0"},{"_id":"2","name":"LAPTOP COMPUTERS","hasSubCategory":"false","parentId":"1"},{"_id":"3","name":"MONITORS","hasSubCategory":"false","parentId":"2"},{"_id":"4","name":"INPUT DEVICES","hasSubCategory":"true","parentId":"0"},{"_id":"5","name":"PRINTERS SCANNERS","hasSubCategory":"false","parentId":"4"},{"_id":"6","name":"ACCESSORIES","hasSubCategory":"false","parentId":"4"}];
    res = arr.filter(v => v.hasSubCategory === "false").map(e => Number(e._id))

console.log(res) // [ 2, 3, 5, 6 ]

В качестве альтернативы вы также можете использовать reduce:

let arr = [{"_id":"1","name":"DESKTOP COMPUTERS","hasSubCategory":"true","parentId":"0"},{"_id":"2","name":"LAPTOP COMPUTERS","hasSubCategory":"false","parentId":"1"},{"_id":"3","name":"MONITORS","hasSubCategory":"false","parentId":"2"},{"_id":"4","name":"INPUT DEVICES","hasSubCategory":"true","parentId":"0"},{"_id":"5","name":"PRINTERS SCANNERS","hasSubCategory":"false","parentId":"4"},{"_id":"6","name":"ACCESSORIES","hasSubCategory":"false","parentId":"4"}];
    res = arr.reduce((a,c) => {if (c.hasSubCategory === "false") a.push(Number(c._id)); return a;}, [])

console.log(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...