javascript - 保存父级构建树形数组

标签 javascript jquery

我正在努力在 JS 中操作树对象,它可能很简单但我找不到。

这是对象:

{
"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/"
        }
    }
}

我正在使用一个简单的递归函数来遍历所有 child :

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

我想使用这个函数来保存面包屑并获得这样的对象:

"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/"
        }
    }
}

};

所以重点是在每个 child 和 parent 中保存完整的面包屑。我应该如何更改解析函数以获取此对象?我试图在每个循环中也传递父级,但我无法准确获得我想要的......

我创建了一个 jsfiddle这里。

非常感谢您的帮助!

最佳答案

您可以检查嵌套对象的属性并分配类别值。

它与支票一起工作,如果

  • object[k] 是一个真值,并且
  • typeof object[k] === 'object',如果类型是一个对象,并且
  • !Array.isArray(object[k]),如果实际属性不是数组,比如新添加的category

然后它分配一个新属性 category,方法是使用之前级别中的类别并向其添加实际键。

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

关于javascript - 保存父级构建树形数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46275251/

相关文章:

javascript - Nodejs : Unexpected token * when using robe

javascript - 在javascript中查找子计数的递归函数

javascript - jquery addclass 显示图片查询

javascript - jQuery 使用空元素检查是否存在

jquery - 隐藏的选择框在 Chrome 中不起作用

javascript - Fancybox 3 Ajax 类型 - 内容自动滚动到底部

javascript - 无法让最简单的 knockout.js 示例工作?

javascript - 短路逻辑或语句,与内联三元相结合

javascript - $(selector).flexslider ({ : function() }) issue - skips first slide 之前

javascript - jQuery slideToggle 函数对我的输入框没有预期的效果