You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中按ownerName嵌套对象数组的分组问题修复求助

修复按ownerName层级分组的JavaScript数据处理代码

现有代码目标是将数据按ownerName→mName→aName→cName的层级嵌套分组,用于权限级别的数据表展示,但目前除ownerName外,后续层级分组逻辑错误,导致嵌套结构混乱。

错误代码

const data = [{"ownerName":"Apple","mName":"Nikolai","aName":"Dhanush","cName":"Thor Odin","id":"Client 1","gName":"","gAmount":"","gls":2,"value":0.855,"date":"22/1/2022","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-1","gName":"Retirement1","gAmount":10000,"gls":1,"income":"60/40","date":"22/1/2022","value":0.99},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-2","gName":"Save For Child Education","gAmount":70000,"gls":1,"income":"55/45","date":"5/12/2023","value":0.72}]},{"ownerName":"Apple","mName":"Nikolai","aName":"Dhanush","cName":"Steve Rogers","id":"Client 2","gName":"Save for Investment","gAmount":67000,"gls":1,"value":0.7,"date":"22/1/2022","income":"60/40"},{"ownerName":"Apple","mName":"Nikolai","aName":"Dhanush","cName":"Wanda Vision","id":"Client 3","gls":0,"value":0.9,"date":"","income":""},{"ownerName":"Apple","mName":"Nikolai","aName":"Dhanush","cName":"Tony Stark","id":"Client 4","gName":"","gAmount":"","gls":2,"value":0.29,"date":"27/10/2019","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-4","gName":"Education Loan","gAmount":500,"gls":1,"income":"60/40","date":"27/10/2019","value":0.29},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-5","gName":"House Loan","gAmount":23000,"gls":1,"income":"30/70","date":"16/6/2022","value":0.29}]},{"ownerName":"Apple","mName":"Nikolai","aName":"Joe","cName":"Hack Eye","id":"Client 5","gName":"Save For World Tour","gAmount":400000,"gls":1,"value":0.74,"date":"","income":"60/40"},{"ownerName":"Apple","mName":"Nikolai","aName":"Joe","cName":"Nick Fury","id":"Client 6","gName":"","gAmount":"","gls":2,"value":0.44499999999999995,"date":"9/3/2022","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-7","gName":"To Build A Workspace","gAmount":42340,"gls":1,"income":"60/40","date":"9/3/2022","value":0.6},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-8","gName":"Cloud Examination","gAmount":8730,"gls":1,"income":"30/70","date":"9/11/2021","value":0.29}]},{"ownerName":"Apple","mName":"Nikolai","aName":"Joe","cName":"Star Lord","id":"Client 7","gName":"Save For Child Education","gAmount":400000,"gls":1,"value":0.93,"date":"","income":"55/45"},{"ownerName":"Apple","mName":"Rohan","aName":"Pal","cName":"Thanos","id":"Client 8","gName":"","gAmount":"","gls":3,"value":0.29,"date":"2/11/2019","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-10","gName":"Relocation Expense Goal","gAmount":400000,"gls":1,"income":"22/78","date":"2/11/2019","value":0.29},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-11","gName":"Save for to buy bike","gAmount":400000,"gls":1,"income":"50/50","date":"1/1/2020","value":0.29},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-12","gName":"Save For Education","gAmount":400000,"gls":1,"income":"65/35","date":"9/5/2022","value":0.29}]},{"ownerName":"Apple","mName":"Rohan","aName":"Pal","cName":"Ego","id":"Client 9","gName":"Save For Education","gAmount":400000,"gls":1,"value":0.72,"date":"","income":"65/35"},{"ownerName":"Apple","mName":"Rohan","aName":"Pal","cName":"Bruce Banner","id":"Client 10","gName":"","gAmount":"","gls":2,"value":0.975,"date":"9/10/2018","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-14","gName":"Car Loan","gAmount":23000,"gls":1,"income":"60/40","date":"9/10/2018","value":0.99},{"mName":"","aName":"","cName":"","id":"goal-15","gName":"Bike Loan","gAmount":4600,"gls":1,"income":"30/70","date":"9/11/2021","value":0.96}]}]

const
nodOrder = 
  { ownerName:'',mName: '',  aName: '', cName: '', id: ''
  , gName: ''   ,  gAmount: '',  gls: '',      value: ''
  , date: '', income: ''
  } 
, levels = 
  { ownerName:   { arr: null, val: '' },
    mName: { arr: null, val: '' }
  , aName: { arr: null, val: '' }
  , cName:  { arr: null }
  }
, ResultData = []
;
data.forEach( ({ ownerName, mName, aName, ...otherProps }) => 
{
let
  row_0 = Object.assign({}, nodOrder, { ownerName })
, row_1 = Object.assign({}, nodOrder, { mName })
, row_2 = Object.assign({}, nodOrder, { aName })
, row_3 = Object.assign({}, nodOrder, otherProps )
  ;

if (levels.ownerName.val !== ownerName )
  {
  levels.ownerName.val = ownerName 
  levels.ownerName.arr = row_0.rows = []
  levels.mName.val = ''
  ResultData.push( row_0 )
  }

if (levels.mName.val !== mName )
  {
    levels.mName.val = mName 
    levels.mName.arr = row_1.rows = []
    levels.mName.val = ''
    levels.ownerName.arr.push( row_1 )
  }

if (levels.aName.val !== aName )
  {
  levels.aName.val = aName 
  levels.aName.arr = row_2.rows = []
  levels.mName.arr.push( row_2 )
  }

levels.cName.arr = (otherProps.rows) ? (row_3.rows = []) : null
levels.aName.arr.push( row_3 )

if (otherProps.rows) 
  {
  otherProps.rows.forEach( subRow => 
    {
    let sRow = Object.assign({}, nodOrder, subRow )
    levels.cName.arr.push( sRow )
    })
  }
})
console.log( JSON.stringify(ResultData ) )

错误分析

  1. mName层级重复重置:在mName判断分支里,刚赋值levels.mName.val = mName就立刻重置为'',导致每次循环都认为mName发生变化,重复添加mName行
  2. 层级状态未完全重置:切换ownerName时,仅重置了mName的val,未重置aName的val和arr,导致aName不会重新判断,旧的aName层级会被重复使用
  3. 层级关联逻辑错误:mName的arr未正确关联到当前ownerName的rows数组,导致嵌套层级混乱

修复后的代码

const data = [{"ownerName":"Apple","mName":"Nikolai","aName":"Dhanush","cName":"Thor Odin","id":"Client 1","gName":"","gAmount":"","gls":2,"value":0.855,"date":"22/1/2022","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-1","gName":"Retirement1","gAmount":10000,"gls":1,"income":"60/40","date":"22/1/2022","value":0.99},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-2","gName":"Save For Child Education","gAmount":70000,"gls":1,"income":"55/45","date":"5/12/2023","value":0.72}]},{"ownerName":"Apple","mName":"Nikolai","aName":"Dhanush","cName":"Steve Rogers","id":"Client 2","gName":"Save for Investment","gAmount":67000,"gls":1,"value":0.7,"date":"22/1/2022","income":"60/40"},{"ownerName":"Apple","mName":"Nikolai","aName":"Dhanush","cName":"Wanda Vision","id":"Client 3","gls":0,"value":0.9,"date":"","income":""},{"ownerName":"Apple","mName":"Nikolai","aName":"Dhanush","cName":"Tony Stark","id":"Client 4","gName":"","gAmount":"","gls":2,"value":0.29,"date":"27/10/2019","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-4","gName":"Education Loan","gAmount":500,"gls":1,"income":"60/40","date":"27/10/2019","value":0.29},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-5","gName":"House Loan","gAmount":23000,"gls":1,"income":"30/70","date":"16/6/2022","value":0.29}]},{"ownerName":"Apple","mName":"Nikolai","aName":"Joe","cName":"Hack Eye","id":"Client 5","gName":"Save For World Tour","gAmount":400000,"gls":1,"value":0.74,"date":"","income":"60/40"},{"ownerName":"Apple","mName":"Nikolai","aName":"Joe","cName":"Nick Fury","id":"Client 6","gName":"","gAmount":"","gls":2,"value":0.44499999999999995,"date":"9/3/2022","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-7","gName":"To Build A Workspace","gAmount":42340,"gls":1,"income":"60/40","date":"9/3/2022","value":0.6},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-8","gName":"Cloud Examination","gAmount":8730,"gls":1,"income":"30/70","date":"9/11/2021","value":0.29}]},{"ownerName":"Apple","mName":"Nikolai","aName":"Joe","cName":"Star Lord","id":"Client 7","gName":"Save For Child Education","gAmount":400000,"gls":1,"value":0.93,"date":"","income":"55/45"},{"ownerName":"Apple","mName":"Rohan","aName":"Pal","cName":"Thanos","id":"Client 8","gName":"","gAmount":"","gls":3,"value":0.29,"date":"2/11/2019","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-10","gName":"Relocation Expense Goal","gAmount":400000,"gls":1,"income":"22/78","date":"2/11/2019","value":0.29},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-11","gName":"Save for to buy bike","gAmount":400000,"gls":1,"income":"50/50","date":"1/1/2020","value":0.29},{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-12","gName":"Save For Education","gAmount":400000,"gls":1,"income":"65/35","date":"9/5/2022","value":0.29}]},{"ownerName":"Apple","mName":"Rohan","aName":"Pal","cName":"Ego","id":"Client 9","gName":"Save For Education","gAmount":400000,"gls":1,"value":0.72,"date":"","income":"65/35"},{"ownerName":"Apple","mName":"Rohan","aName":"Pal","cName":"Bruce Banner","id":"Client 10","gName":"","gAmount":"","gls":2,"value":0.975,"date":"9/10/2018","income":"","rows":[{"ownerName":"","mName":"","aName":"","cName":"","id":"goal-14","gName":"Car Loan","gAmount":23000,"gls":1,"income":"60/40","date":"9/10/2018","value":0.99},{"mName":"","aName":"","cName":"","id":"goal-15","gName":"Bike Loan","gAmount":4600,"gls":1,"income":"30/70","date":"9/11/2021","value":0.96}]}]

const nodOrder = {
  ownerName: '', mName: '', aName: '', cName: '', id: '',
  gName: '', gAmount: '', gls: '', value: '',
  date: '', income: ''
};

const levels = {
  ownerName: { arr: null, val: '' },
  mName: { arr: null, val: '' },
  aName: { arr: null, val: '' },
  cName: { arr: null }
};

const ResultData = [];

data.forEach(({ ownerName, mName, aName, ...otherProps }) => {
  // 仅当ownerName变化时创建新的owner行
  if (levels.ownerName.val !== ownerName) {
    const row_0 = Object.assign({}, nodOrder, { ownerName });
    levels.ownerName.val = ownerName;
    levels.ownerName.arr = row_0.rows = [];
    // 切换owner时重置所有子层级状态
    levels.mName.val = '';
    levels.mName.arr = null;
    levels.aName.val = '';
    levels.aName.arr = null;
    ResultData.push(row_0);
  }

  // 仅当mName变化且当前有owner层级时创建新的m行
  if (levels.mName.val !== mName && levels.ownerName.arr) {
    const row_1 = Object.assign({}, nodOrder, { mName });
    levels.mName.val = mName;
    levels.mName.arr = row_1.rows = [];
    // 切换m时重置a层级状态
    levels.aName.val = '';
    levels.aName.arr = null;
    levels.ownerName.arr.push(row_1);
  }

  // 仅当aName变化且当前有m层级
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:51:04