2016-12-02 116 views
0

我是Jquery的新手,任何人都可以帮助我或告诉我如何处理此问题, 我尝试了一些其他示例,但我没有得到它们。Json数据嵌套Json数据

var arr = [ 
      { PARENTNODE: "Resource Management", CHILDNODE: "ManPower", OPERATIONNAME: "Update" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Manpower", OPERATIONNAME: "View" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "ManPower", OPERATIONNAME: "Delete" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Manpower", OPERATIONNAME: "Insert" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "Update" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "View" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "Insert" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "Delete" }, 
      { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "Update" }, 
      { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "View" }, 
      { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "Insert" }, 
      { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "Delete" } 
      ], 

我需要这个JSON数据转换为类似这样的嵌套数据,

[{ 
    text: "Resource Management", 
    items: [{ 
     text: "Manpower",   
     items: [{ 
      text: "Update", 
     }, { 
      text: "Delete", 
     }, { 
      text: "Insert", 
     }, { 
      text: "View", 
     }] 
    }, { 
     text: "Vehicles", 
     items: [{ 
      text: "Update", 
     }, { 
      text: "Delete", 
     }, { 
      text: "Insert", 
     }, { 
      text: "View", 
     }] 
    }]   
}, { 
    text: "Contacts", 
    items: [{ 
     text: "Manage Customers", 
     items: [{ 
      text: "Update", 
     }, { 
      text: "Delete", 
     }, { 
      text: "Insert", 
     }, { 
      text: "View", 
     }] 
    }] 
}] 

提前感谢!请帮助我。

+3

您是否尝试过这么远吗? – Hiral

+0

你也可以按标准解释小组吗? – GiuServ

回答

1

在纯JS(有点原始的,更好的解决方案,欢迎):

var arr = [ 
    { PARENTNODE: "Resource Management", CHILDNODE: "ManPower", OPERATIONNAME: "Update" }, 
    { PARENTNODE: "Resource Management", CHILDNODE: "Manpower", OPERATIONNAME: "View" }, 
    { PARENTNODE: "Resource Management", CHILDNODE: "ManPower", OPERATIONNAME: "Delete" }, 
    { PARENTNODE: "Resource Management", CHILDNODE: "Manpower", OPERATIONNAME: "Insert" }, 
    { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "Update" }, 
    { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "View" }, 
    { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "Insert" }, 
    { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "Delete" }, 
    { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "Update" }, 
    { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "View" }, 
    { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "Insert" }, 
    { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "Delete" } 
]; 

var output = []; 

arr.forEach(function(item) { 
    var indexParentNode = addItem(item.PARENTNODE, output); 
    var indexChildNode = addItem(item.CHILDNODE, output[indexParentNode].items); 
    addItem(item.OPERATIONNAME, output[indexParentNode].items[indexChildNode].items, true); 
}); 

function addItem(item, arr, withNoItems) { 
    var index = indexOf(item, arr); 
    var tpl = {text: item, items: []}; 

    if (!! withNoItems) delete tpl.items; 

    if (index === -1) { 
     arr.push(tpl); 
     return arr.length - 1; 
    } 
    else { 
     return index; 
    } 
} 

function indexOf(needle, haystack) { 
    var i = 0; 

    while (i < haystack.length) { 
     if (haystack[i].text === needle) return i; 
     i++; 
    } 

    return -1; 
} 

console.log(output); 
0

不是最完美的解决方案,但这里有一个出发点:

<script type="text/javascript"> 
    'use strict'; 

    var arr = [ 
      { PARENTNODE: "Resource Management", CHILDNODE: "ManPower", OPERATIONNAME: "Update" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Manpower", OPERATIONNAME: "View" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "ManPower", OPERATIONNAME: "Delete" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Manpower", OPERATIONNAME: "Insert" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "Update" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "View" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "Insert" }, 
      { PARENTNODE: "Resource Management", CHILDNODE: "Vehicles", OPERATIONNAME: "Delete" }, 
      { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "Update" }, 
      { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "View" }, 
      { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "Insert" }, 
      { PARENTNODE: "Contacts", CHILDNODE: "Customers", OPERATIONNAME: "Delete" } 
      ]; 

    function getOrCreateListItem(list, searchItemName) 
    { 
     var newItem = null; 

     //Get item if it's already in the list 
     for (var item of list) { 
      if (item.text == searchItemName) { 
       newItem = item; 
       break; 
      } 
     } 

     //If no item found, create new item 
     if (!newItem) { 
      list.push({ 
       text: searchItemName, 
       items: [] 
      }); 
      newItem = list[list.length-1]; 
     } 

     return newItem; 
    } 

    var newData = []; 

    for (var item of arr) { 

     //Get parent item 
     var parent = getOrCreateListItem(newData, item.PARENTNODE); 

     //Get child item 
     var child = getOrCreateListItem(parent.items, item.CHILDNODE); 

     //Add child item data 
     child.items.push({text: item.OPERATIONNAME}); 
    } 

    console.log(newData); 

</script> 
+0

谢谢@nerdword,在childnode项目中获取操作名称但是我得到父项目外的子节点。 –

+0

@RaviKumar我刚刚更改了代码示例以便使用数组而不是对象(手动搜索以查找列表中的现有项目)。这会给你一个更接近的结果。 – Nerdwood