JSON配列のノードデータをツリー構造データに変換する

1413 ワード

/**
 *  id、parentId  JSON               
 * @param {Array} arr
 * @param {String} id
 * @param {String} pid
 * @return {Array}
 */
 function arrayToTree(arr, id, pid) {
  let data = JSON.parse(JSON.stringify(arr));
  if (!data || !data.length) return [];
  let targetData = [];                    //       (  )
  let records = {};
  let itemLength = data.length;           //       
  for (let i = 0; i < itemLength; i++){
    let o = data[i];
    records[o[id]] = o;
  }
  for (let i = 0; i < itemLength; i++) {
    let currentData = data[i];
    let parentData = records[currentData[pid]];
    if (!parentData) {
      targetData.push(currentData);
      continue;
    }
    parentData.children = parentData.children || [];
    parentData.children.push(currentData);
  }
  return targetData;
}
/**
 *            
 *
 * @export
 * @param {Array} array
 * @param {Object} parent    
 * @param {Array} tree
 * @return {Array}
 */
function array2tree(array, parent = { id: 0 }, tree = []) {
  let treeData = tree
  const children = _.filter(array, function(child) {
    return child.parentId === parent.id
  })
  if (!_.isEmpty(children)) {
    if (parent.id === 0) {
      treeData = children
    } else {
      parent['children'] = children
    }
    _.each(children, function(child) {
      array2tree(array, child)
    })
  }

  return treeData
}