Save the parent to build a tree array

I'm struggling to manipulating a tree object in JS, it might be simple but I can't find out.

Here is the object :

{
"100-silk": {
    "url": "https://www.striiiipes.com/product-category/100-silk/"
},
"apparel": {
    "url": "https://www.striiiipes.com/product-category/apparel/"
},
"ipad-accessories": {
    "url": "https://www.striiiipes.com/product-category/ipad-accessories/",
    "ipad-air": {
        "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-air/"
    },
    "ipad-mini": {
        "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-mini/"
    },
    "ipad-pro": {
        "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-pro/",
        "ipad-pro-12-9": {
            "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-pro/ipad-pro-12-9/"
        },
        "ipad-pro-9-7": {
            "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-pro/ipad-pro-9-7/"
        }
    }
}

I'm using a simple recursion function to get throught all childrens :

function parseCategories(a) {
    if (typeof a === 'object') {
        $.each(a, function (i, v) {
            //if we only have a "url" object, then we're on last branch and can parse it
            if (Object.keys(v).length === 1 && 'url' in v) {
                //dosomething
            } else { // then we need to go deeper in the tree
                parseCategories(v);
            }
        })
    }
}

I'd like to use this function to also save the breadcrumb and get an object like this :

"100-silk": {
    "categories" : ["100-silk"],
    "url": "https://www.striiiipes.com/product-category/100-silk/"
},
"apparel": {
    "categories" : ["apparel"],
    "url": "https://www.striiiipes.com/product-category/apparel/"
},
"ipad-accessories": {
    "categories" : ["ipad-accessories"],
    "url": "https://www.striiiipes.com/product-category/ipad-accessories/",
    "ipad-air": {
        "categories" : ["ipad-accessories", "ipad-air"],
        "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-air/"
    },
    "ipad-mini": {
        "categories" : ["ipad-accessories", "ipad-mini"],
        "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-mini/"
    },
    "ipad-pro": {
        "categories" : ["ipad-accessories", "ipad-pro"],
        "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-pro/",
        "ipad-pro-12-9": {
            "categories" : ["ipad-accessories", "ipad-pro", "ipad-pro-12-9"],
            "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-pro/ipad-pro-12-9/"
        },
        "ipad-pro-9-7": {
            "categories" : ["ipad-accessories", "ipad-pro", "ipad-pro-9-7"],
            "url": "https://www.striiiipes.com/product-category/ipad-accessories/ipad-pro/ipad-pro-9-7/"
        }
    }
}

};

So the point is to save the full breadcrumb in each child and parent. How should I change the parsing function to get this object ? I've tried to pass also the parent in each loop but I can't manage to get exactly what I want...

I've create a jsfiddle here.

Thanks a lot for your help !

Upvotes: 1

Views: 56

Answers (1)

Nina Scholz
Nina Scholz

Reputation: 386560

You could check the properties for nested objects and assign the category value.

It works with a check, if

  • object[k] is a truthy value, and
  • typeof object[k] === 'object', if the type is an object, and
  • !Array.isArray(object[k]), if the actual property is not an array, like a new added category,

then it assigns a new property category by using the category from the level before and adding the actual key to it.

function updateCategory(object) {        
    Object.keys(object).forEach(function (k) {
        if (object[k] && typeof object[k] === 'object' && !Array.isArray(object[k])) {
            object[k].category = (object.category || []).concat(k);
            updateCategory(object[k]);
        }
    });
}
var data = { "100-silk": { url: "URL/100-silk/" }, apparel: { url: "URL/apparel/" }, "ipad-accessories": { url: "URL/ipad-accessories/", "ipad-air": { url: "URL/ipad-accessories/ipad-air/" }, "ipad-mini": { url: "URL/ipad-accessories/ipad-mini/" }, "ipad-pro": { url: "URL/ipad-accessories/ipad-pro/", "ipad-pro-12-9": { url: "URL/ipad-accessories/ipad-pro/ipad-pro-12-9/" }, "ipad-pro-9-7": { url: "URL/ipad-accessories/ipad-pro/ipad-pro-9-7/" } } } };

updateCategory(data);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 1

Related Questions