JS:点表示法转换为嵌套对象

3
我遇到了这个简单函数的困难。 我的目标是将一个带有点符号的字符串解析成嵌套对象。
一个示例数组:
["image", "groups", "groups.tasks", "groups.image"]

我应该给这个吗:

[{
        path: "image",
        populate: []
    }, {
        path: "groups",
        populate: [{
                path: "tasks",
                populate: []
            }, {
                path: "image",
                populate: []
            }]
    }]

我的代码如下:

let populate = [];
const query = ["image", "groups", "groups.tasks", "groups.image"];


function parse(str, arr) {


 let c = str.split(".");
 let p = c.shift();

 console.log(c)

 let entry = {
  path: p,
  populate: []
 };


 if (c.length > 0) {

  console.log("Add to '%s'", p, c)
  parse(c.join("."), entry.populate);

 } else {

  arr.push(entry);

 }


}


query.forEach(function (str, index) {

 parse(str, populate);

});

console.log(populate)

我只得到了父数组,没有子元素:

[ { path: 'image', populate: [] },
  { path: 'groups', populate: [] } ]

我想在RESTful API中使用它,以便可以填充嵌套的mongoose文档。我将传递populate数组到我的express路由中的“.populate(...)”函数。

e.g:

GET /api/computer?populate=image,groups,group.tasks

嵌套对象的深度不应受限制。

通过我的研究,我找到了这个答案: 如何将字符串点表示法转换为嵌套对象? 但我不确定如何修改它以达到我的目标。

2个回答

3

您可以通过减少拆分路径字符串来缩小数组。

var array = ["image", "groups", "groups.tasks", "groups.image"],
    result = array.reduce((r, s) => {
        s.split('.').reduce((a, path) => {
            var object = a.find(o => o.path === path);
            if (!object) {
                a.push(object = { path, populate: [] });
            }
            return object.populate;
        }, r);
        return r;
    }, []);
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


太棒了!非常感谢你! - Marc

0

你可以像这样做。

var aa = ["groups","image","groups.tasks", "groups.image" ]
var result = [];
aa.forEach(element => {

    if (!result.some(a=> a.path === element) && element.indexOf(".") === -1) {
        result.push({ path: element, populate: [] })
    } else {
        if (element.indexOf(".") !== -1) {
            let splittedText = element.split(".");
            if (result.some(a=> a.path === splittedText[0])) {
               var index= result.findIndex(a=> a.path === splittedText[0]);
               result[index].populate.push({ path: splittedText[1], populate: [] });
            }else{
              result.push({ path: splittedText[0], populate: [{ path: splittedText[1], populate: [] }] })              
            }
            
        }
    }
});
console.log(result);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接