繁体   English   中英

解析嵌套的数组对象,并创建一个新的数组

[英]Parse a nested array objects, and create a new array

我在JavaScript中解析了一个嵌套的对象数组,但是在创建目标数组时遇到了困难。

这是正确渲染的Kendo UI树形视图,上面附加了一个示例数组(即最终dataSource数组的外观):

   http://plnkr.co/edit/YpuXJyWgGI7h1bWR0g70?p=preview 

Kendo UI Treeview小部件

我的源数组具有嵌套的“子级”数组,其中叶节点是“ drms”数组。

在解析嵌套子项时,我正在尝试执行以下操作:

  1. 非空的“子级”数组需要重命名为“ drms”
  2. 空的“子级”数组需要删除

这是一个示例源数组:

 [ /* SOURCE ARRAY */ { "category": "Market Risk", "sysid": 1, "children": [ { "category": "General", "sysid": 2, "children": [], "drms": [ { "name": "1 Day VaR (99%)" }, { "name": "10 Day VaR (99%)" } ] }, { "category": "Decomposition", "sysid": 3, "children": [], "drms": [ { "name": "1D VaR Credit" }, { "name": "1D VaR Equity" } ] }, { "category": "Sensitivities", "sysid": 4, "children": [ { "category": "Currency Pairs", "sysid": 11, "children": [ { "category": "EUR/USD", "sysid": 12, "children": [], "drms": [ { "name": "Spot" }, { "name": "Spot - 0.01" } ] } ], "drms": [] } ], "drms": [] } ], "drms": [] }, { "category": "CCR", "sysid": 6, "children": [ { "category": "General (CCR)", "sysid": 7, "children": [], "drms": [ { "name": "MTM" }, { "name": "PFE" } ] } ], "drms": [] } ] 

和我为了渲染Kendo TreeView而手动修改的目标数组:

 [ { "category": "Market Risk", "sysid": 1, "drms": [ { "category": "General", "sysid": 2, "drms": [ { "name": "1 Day VaR (99%)", "riskMeasure": "-PERCENTILE(SUM([99_HSVaR]:[1D]),1)", "cubeVector": "[99_HSVaR]:[1D]" }, { "name": "10 Day VaR (99%)", "riskMeasure": "-PERCENTILE(SUM([99_HSVaR]:[2W]),1)", "cubeVector": "[99_HSVaR]:[2W]" }, { "name": "Day over Day VaR", "riskMeasure": "-PERCENTILE(SUM(today),1)+PERCENTILE(SUM(yesterday),1)", "cubeVector": "[BASELINE]:[99_HSVaR]:[2W] as today, [BASELINE-1]:[99_HSVaR]:[2W] as yesterday" } ] }, { "category": "Decomposition", "sysid": 3, "drms": [ { "name": "1D VaR Credit", "riskMeasure": "SUM([99_HSVaR]:[1D CR])", "cubeVector": "[99_HSVaR]:[1D CR]" }, { "name": "1D VaR Equity", "riskMeasure": "SUM([99_HSVaR]:[1D EQ])", "cubeVector": "[99_HSVaR]:[1D EQ]" } ] }, { "category": "Sensitivities", "sysid": 4, "drms": [ { "category": "Currency Pairs", "sysid": 11, "drms": [ { "category": "EUR/USD", "sysid": 12, "children": [], "drms": [ { "name": "Spot", "riskMeasure": "SUM([EUR_USD by EUR]:[Spot - 0.00])", "cubeVector": "[EUR_USD by EUR]:[Spot - 0.00]" }, { "name": "Spot - 0.01", "riskMeasure": "SUM([EUR_USD by EUR]:[Spot - 0.01])", "cubeVector": "[EUR_USD by EUR]:[Spot - 0.01]" } ] } ], } ] } ], }, { "category": "CCR", "sysid": 6, "drms": [ { "category": "General (CCR)", "sysid": 7, "drms": [ { "name": "MTM", "riskMeasure": "SUM(MTM:MTM)", "cubeVector": "MTM:MTM" }, { "name": "PFE", "riskMeasure": "PERCENTILE(SUM(x),95)", "cubeVector": "[Simulated]:[MCS] IF value > 0 as x" } ] } ] } ] 

和我的JavaScript例程尚无法正常工作。 解析嵌套子项时有些混乱:

 function create_TempDrmTree() { // convert raw def risk measures (drm) data into a tree format for the Kendo treeview widget. var data = getTestDrmTree(); var drmsJson = []; var i = 0; _.each(data, function (item) { drmsJson.push({ "category": item.category, drms: [] }); if (item.children.length > 0) { pushDrms(item.children); } i++; }); function pushDrms(children) { _.each(children, function (item) { if (item.children.length > 0) { pushDrms(item.children); } else { // no more children, so get the DRMs from item // leaving tempty children[] causes an issue on Kendo treeview delete item.children; drmsJson[i]["drms"] = item; } }); } return drmsJson; } 

根据您的最初想法,我做了一些修改。 这非常适合我的情况。

编辑:从什么是最有效的克隆对象的方法? ,我们可以轻松创建一个全新的阵列,并保持原始阵列不变。

function parseDrmTree(items, isCloned) {

    if (isCloned !== true) {
        // Create json string from original item, and then parse it.
        // And only do this at the root.
        items = JSON.parse(JSON.stringify(items));
        isCloned = true;
    }
    // reparse the DRM source tree, renaming "children" array to "drms".
    items.forEach(function (item, index) {
        if (item.children.length > 0) {
            // copy children[] to  drms[]
            item.drms = parseDrmTree(item.children, isCloned);
        }                
        // children[] is empty; drms[] exist at this level
        delete item.children;
    }, this);
    return items;
}

您不必提供isCloned值,只需输入目标数组,该函数将创建一个全新的数组,并使用它来创建所需的结构,并且原点保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM