生成JSDoc的参数和子参数数组

时间:2016-04-09 13:39:19

标签: javascript arrays jsdoc

我正在扩展haruki模板以支持子参数。

我的JSDoc评论是:

/**
 * @constructor Foobar
 * param {Object} firstLevel
 * param {Object} [firstLevel.secondLevel]
 * param {Object} [firstLevel.secondLevel.thirdLevel]
 */

默认情况下,haruki会导出一个扁平的参数数组,如下所示:

[
  { name: 'firstLevel' },
  { name: '[firstLevel.secondLevel]' },
  { name: '[firstLevel.secondLevel.thirdLevel]' }
]

但我需要得到这样的输出:

[
  {
    name: 'firstLevel',
    parameters: [
      {
        name: 'secondLevel',
        parameters: [
          { name: 'thirdLevel' }
        ]
      }
    ]
}

我的想法是创建一个Object然后将其转换为Array,这样我就可以轻松访问嵌套参数。

但我无法找到递归问题的解决方案......

我的尝试如下:

function subParam(paramsObj, names, paramObj) {
    if (names.length === 1) {
        paramsObj[names[0]] = paramObj;
    } else {
        paramsObj[names[0]].parameters[names[1]] = paramObj;
    }
}

if (element.params) {
  var params = {};
  for (i = 0, len = element.params.length; i < len; i++) {
    var names = element.params[i].name.replace(/\[|\]/g, '').split('.');
    var obj = {
      'name': element.params[i].name,
      'type': element.params[i].type? element.params[i].type.names : [],
      'description': element.params[i].description || '',
      'default': hasOwnProp.call(element.params[i], 'defaultvalue') ? element.params[i].defaultvalue : '',
      'optional': typeof element.params[i].optional === 'boolean'? element.params[i].optional : '',
      'nullable': typeof element.params[i].nullable === 'boolean'? element.params[i].nullable : ''
    };
    subParam(params, names, obj);
  }
  // convert object to array somehow
}

想法?

1 个答案:

答案 0 :(得分:1)

JavaScript 中, key 唯一的键值对最适合 Object 而不是 Array

对象中创建树,然后将其重新构建为所需的数组

var data = [
    { name: 'firstLevel' },
    { name: '[firstLevel.secondLevel]' },
    { name: '[firstLevel.secondLevel.thirdLevel]' }
];

transform(data);
/*
[
    {
        "name": "firstLevel",
        "parameters": [
            {
                "name": "secondLevel",
                "parameters": [
                    {
                        "name": "thirdLevel"
                    }
                ]
            }
        ]
    }
]
*/

用法

{{1}}

请注意,您没有在所需的输出中显示可选数据