迭代一个Json对象并存储最终结果

时间:2019-07-01 08:18:38

标签: javascript arrays mongodb object ecmascript-6

我正在尝试迭代一个由类别数组组成的JSON对象。这些类别可能有也可能没有子类别。

如果  hasSubcategory = false, 那么类别ID应该存储在最终数组中。

如果hasSubcategory = true,则应迭代直到子类别变为hasSubcategory = false并将ID存储在  最终数组。

parentId字段代表类别的父类别。 更重要的是,可能有一个子类别的子类别

最后一个数组应仅具有hasSubcategory = false的类别ID。

  

对于以下示例,最终数组应为[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 :(得分:0)

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)

答案 1 :(得分:0)

我建议链接filter + map方法:

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

答案 2 :(得分:0)

这真的很简单-只需使用filter提取hasSubCategoryfalse的项目,然后将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);