1. 程式人生 > >js將物件陣列中具有父子關係的資料換成樹形結構

js將物件陣列中具有父子關係的資料換成樹形結構

let allRes = [
  {
    id: 4,
    resName: "刪除角色",
    parentId: 2
  },
  {
    id: 3,
    resName: "編輯角色",
    parentId: ''
  },
  {
    id: 2,
    resName: "設定許可權",
    parentId: ''
  },
  {
    id: 5,
    resName: "新增使用者",
    parentId: 4
  },
  {
    id: 6,
    resName: "更新使用者",
    parentId: 4
  },
  {
    id: 7,
    resName: "刪除使用者",
    parentId: 6
  },
  {
    id: 8,
    resName: "重置密碼",
    parentId: 3
  },
  {
    id: 9,
    resName: "新增地區",
    parentId: 5
  },
  {
    id: 10,
    resName: "編輯地區",
    parentId: 6
  }
];

function treeObj(originObj){
	//物件深拷貝
	let obj ={};
	for (key in originObj){
		var val = originObj[key];
  		obj[key] = typeof val === 'object' ? arguments.callee(val):val;
   }
   //物件新增children鍵值,用於存放子樹
   obj['children'] = [];
   return obj;
}

//data:帶轉換成樹形結構的物件陣列
//attributes:物件屬性
function toTreeData (data, attributes) {
  let resData = data;
  let tree = [];

 //找尋根節點
  for (let i = 0; i < resData.length; i++) {

    if (resData[i][attributes.parentId] === ''|| resData[i][attributes.parentId] === null) {
      tree.push( treeObj(resData[i]) );
      resData.splice(i, 1);
      i--;
    }
  }

  run(tree);

  //找尋子樹
  function run(chiArr) {
    if (resData.length !== 0) {
      for (let i = 0; i < chiArr.length; i++) {
        for (let j = 0; j < resData.length; j++) {
          if (chiArr[i][attributes.id] === resData[j][attributes.parentId]){
            let obj = treeObj(resData[j]);
            chiArr[i].children.push(obj);
            resData.splice(j, 1);
            j--;
          }
        }
        run(chiArr[i].children);
      }
    }
  }

  return tree;

}

let data = allRes;
// 屬性配置資訊
let attributes = {
      id: 'id',
      parentId: 'parentId',
  };
let treeData = toTreeData(data, attributes);

console.log(treeData);
</script>
本文根據《js將有父子關係的資料轉換成樹形結構資料》部落格進行適當改編。

相關推薦

js物件陣列具有父子關係資料樹形結構

let allRes = [ { id: 4, resName: "刪除角色", parentId: 2 }, { id: 3, resName: "編輯角色", parentId: '' }, {

[JS] 查詢物件陣列某屬性的最大最小值

查詢物件陣列中某屬性的最大最小值的快捷方法 例如要查詢array陣列中物件的value屬性的最大值 var array=[ { "index_id": 119, "area_id": "18335623",

js如何向陣列新增物件並通過ajax向後臺傳遞list資料

js動態向陣列新增物件,並通過ajax提交List資料到後臺 var data=[{name: '張三',age: 18,id: 1},{name: '李四',age: 22,id: 2}]; var test= []; for (var i = 0; i < data.le

js把屬性具有父子關係的json檔案轉變成json樹

方法也是百度來的,親測可用 希望能幫助到大家 <script> var data = [{ "address": "蕪湖弋江區", "id": "1", "latitude": 31.379996, "longitude": 118

JavaScript 數組具有相同值的對象 取出組成新的數組

else 一個數 function 內容 pre 統一 .so gpo fun 1 var arr=[{name:2,id:3},{name:2,id:4},{name:3,id:5},{name:3,id:6},{name:1,id:1},{name:1,id:2}

js數組一個或多個字段相同的子元素合並

++ body 遇到 return json 合並 arr 可能 var 最近js中遇到js將數組中一個或多個字段相同的子元素中合並,相信很多朋友也有遇到,大家可能有多種方法,我在這裏記錄一個相對簡單的方法,當然大家如有其它更好的方法,請提出來大家共同學習。 //將經濟事

bootstrap 多選按鈕實現方式,js,jQuery刪除陣列指定元素

bootstrap有許多,非常漂亮的設計,不用自己苦惱於css 的使用。 bootstrap使用,實現多選方法: 1、使用bootstrap的表格標籤,表格內容為PHP返回前端資料, <table class="table table-hover table-bordered"

js怎麼刪除陣列重複的元素?

刪除陣列中重複的元素 剛剛看到這篇文章,就立馬過來收藏,雖然還沒看懂,希望我再研究一下面是統計陣列中重複元素的個數 var arr = []; var result = [‘2017年6月’, ‘2017年6月’, ‘2017年6月’, ‘2017年5月’, ‘2017年5月’, ‘20

js 數組的每一項安裝奇偶重新組合一個數組對象

方法 else meta {} alt utf lse img png <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>字符

JS-從排序陣列刪除重複項

給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。 不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。 示例1 給定陣列 nums = [1,1,2], 函式應該返回新的長度 2, 並

JS刪除JSON陣列的元素的兩種方法:delete和splice

最近的需求中,需要從JSON陣列中刪除元素,之前不太瞭解,特地查了一下,總結一下: splice(startIndex,count);這個方法用於從陣列的第startIndex位開始,刪除count個元素。 說明: 1、滿足條件的元素直接被刪除,腳標重信排 2、sta

js物件陣列的交集/並集/差集/去重

1.求交集    var arr1 = [{name:'name1',id:1},{name:'name2',id:2},{name:'name3',id:3}]; var arr1Id = [1,2,3] var arr2 = [{name:'name1',id

JS找出陣列唯一不同的數

一個數組中只有一個數是唯一的,其他數都是成對出現,找出這個唯一的數。 分析:由於位運算子異或運算的特點,即兩個相同的數進行異或運算時,其結果為0,所以當將陣列中所有的元素進行異或運算時,其結果必定為那

js簡單刪除陣列任意元素

////刪除陣列中任意元素 ///arr需要去除元素的陣列 ///str需要去除的內容 function spliceArr(arr,str){ for (var i = 0; i < arr.length; i++) { if (arr

js物件json格式

/** * 序列化成json字串 * @param obj * @return */ function Serialize(obj){ switch(obj.construc

js隨機從陣列取出幾個元素

JS如何從一個數組中隨機取出一個元素或者幾個元素。假如陣列為var items = ['1','2','4','5','6','7','8','9','10'];1.從陣列items中隨機取出一個元素/

js移除陣列元素-- 倒著遍歷陣列,繞過改變下標的問題

題目描述 移除陣列 arr 中的所有值與 item 相等的元素,直接在給定的 arr 陣列上進行操作,並將結果返回 示例1 輸入 [1, 2, 2, 3, 4, 2, 2], 2 輸出 [1, 3, 4] 我一開始還好死不死用的foreach,忽略

java從一個物件陣列刪除元素和判斷物件陣列存了幾個元素的方法

//從陣列中刪除元素方法 private int arrayTotal=0; Pet[] pets=new Pet[10]; pets[1]=dog; pets[2]=cat; pets[3]=pig

Vue.js之在陣列插入重複資料

1、在預設的情況下,Vue.js預設不支援往陣列中加入重複的資料。可以使用track-by="$index"來實現。 2、不使用track-by="$index"的陣列插入,陣列不支援重複資料的插入