原始的數(shù)據(jù)是平鋪的 比如
originalData: [
{ company: 'AAA', department:'AAA-D1', office: 'AAA-D1-O1', pass: 1, onhold: 3},
{ company: 'AAA', department:'AAA-D1', office: 'AAA-D1-O2', pass: 3, onhold: 5},
{ company: 'AAA', department:'AAA-D2', office: 'AAA-D2-O1', pass: 2, onhold: 7},
{ company: 'BBB', department:'BBB-D1', office: 'BBB-D1-O1', pass: 1, onhold: 3},
{ company: 'BBB', department:'BBB-D2', office: 'BBB-D2-O1', pass: 4, onhold: 3},
{ company: 'BBB', department:'BBB-D3', office: 'BBB-D3-O1', pass: 1, onhold: 3},
....
....
]
希望轉(zhuǎn)換成
treeData: [
{ label: 'AAA', department:'AAA-D1', office: 'AAA-D1-O1', pass: 6, onhold: 15, // company level
children: [ // department level
{label: 'AAA-D1', pass: 4, onhold: 8,
children: [ // office level
{label: 'AAA-D1-O1', pass: 1, onhold: 3},
{label: 'AAA-D1-O2', pass: 1, onhold: 3},
]
},
{label: 'AAA-D2', pass: 2, onhold: 7,
children: [
{label: 'AAA-D2-O1', pass: 1, onhold: 3},
]
},
]
},
...
...
]
根據(jù)指定的列 轉(zhuǎn)換成父子結(jié)構(gòu)的數(shù)據(jù) 比如 上面的是根據(jù) ['company', 'department', 'office'] 不知道怎么寫了 請大神指導(dǎo) :( :( :( :( :(
你的輸出格式應(yīng)該有問題,起碼label: 'AAA', department:'AAA-D1', office: 'AAA-D1-O1', pass: 6, onhold: 15, // company level
是不合理的,最多是label: 'AAA', pass: 6, onhold: 15, // company level
吧
如果數(shù)據(jù)能夠保證全是這樣的結(jié)構(gòu)(只有如上的3級),其實還是比較好處理的。
var moriginalData= [
{ company: 'AAA', department:'AAA-D1', office: 'AAA-D1-O1', pass: 1, onhold: 3},
{ company: 'AAA', department:'AAA-D1', office: 'AAA-D1-O2', pass: 3, onhold: 5},
{ company: 'AAA', department:'AAA-D2', office: 'AAA-D2-O1', pass: 2, onhold: 7},
{ company: 'BBB', department:'BBB-D1', office: 'BBB-D1-O1', pass: 1, onhold: 3},
{ company: 'BBB', department:'BBB-D2', office: 'BBB-D2-O1', pass: 4, onhold: 3},
{ company: 'BBB', department:'BBB-D3', office: 'BBB-D3-O1', pass: 1, onhold: 3}
];
function a2o(originalData){
var outData=[];
var outObj={};
for(var i=0;i<originalData.length;i++){
var company= originalData[i].company;
var department= originalData[i].department;
var office={label:originalData[i].office, pass:originalData[i].pass, onhold:originalData[i].onhold};
if(outObj[company]===undefined){
outObj[company]={childrenKey:[], pass:0, onhold:0};
}
if(outObj[company][department]===undefined){
outObj[company][department]={children:[], pass:0, onhold:0 };
outObj[company].childrenKey.push(department)
}
outObj[company][department].children.push(office);
outObj[company][department].pass=outObj[company][department].pass+office.pass;
outObj[company].pass=outObj[company].pass+office.pass;
outObj[company][department].onhold=outObj[company][department].onhold+office.onhold;
outObj[company].onhold=outObj[company].onhold+office.onhold;
}
for( var com in outObj){
var tmpA={label:com, pass:outObj[com].pass, onhold:outObj[com].onhold, children:[]};
for (var j=0; j<outObj[com].childrenKey.length; j++ ){
var tD=outObj[com][ outObj[com].childrenKey[j] ];
tmpA.children.push({label:outObj[com].childrenKey[j] ,
pass:tD.pass ,
onhold:tD.onhold ,
children:tD.children} );
}
outData.push(tmpA);
}
return outData;
}
var treeDate=a2o(moriginalData)
console.log(treeDate);
答完才發(fā)現(xiàn)你要的是能根據(jù)指定列進(jìn)行映射...
那我再想想,下面的當(dāng)參考吧 ORZ...
var map = originalData.reduce((p, c) => {
let {company, department, office, pass, onhold} = c
if (!p[company]) p[company] = {}
if (!p[company][department]) p[company][department] = {}
p[company][department][office] = {pass, onhold}
return p
}, {})
var reduce = (obj, key) => obj.children.reduce((p, c) => [p += c[key], p][1], 0)
var result = Object.keys(map).map(cKey => {
let company = {label: cKey}
company.children = Object.keys(map[cKey]).map(dKey => {
let department = {label: dKey}
department.children = Object.keys(map[cKey][dKey]).map(oKey => {
let office = map[cKey][dKey][oKey]
return {label: oKey, pass: office.pass, onhold: office.onhold}
})
['onhold', 'pass'].forEach(key => department[key] = reduce(department, key))
return department
})
['onhold', 'pass'].forEach(key => company[key] = reduce(company, key))
return company
})
輸出:
[
{
"label": "AAA", "onhold": 15,"pass": 6
"children": [ { "label": "AAA-D1", "onhold": 8, "pass": 4
"children": [ { "label": "AAA-D1-O1", "pass": 1, "onhold": 3 },
{ "label": "AAA-D1-O2", "pass": 3, "onhold": 5 }]
}, {
"label": "AAA-D2", "onhold": 7,"pass": 2
"children": [ { "label": "AAA-D2-O1", "pass": 2, "onhold": 7 } ]
}]
}, {
"label": "BBB", "onhold": 9,"pass": 6
"children": [ { "label": "BBB-D1", "onhold": 3, "pass": 1
"children": [ { "label": "BBB-D1-O1", "pass": 1, "onhold": 3 }]
}, {
"label": "BBB-D2", "onhold": 3,"pass": 4
"children": [ { "label": "BBB-D2-O1", "pass": 4, "onhold": 3 } ]
}, {
"label": "BBB-D3", "onhold": 3,"pass": 1
"children": [ { "label": "BBB-D3-O1", "pass": 1, "onhold": 3 } ]
}]
}]
思路上是先把原始數(shù)組做一次樹級映射,然后再從樹生成各層次信息,這樣會比較好理解一些。
你題目描述中有一些奇怪的地方:company level
里的 department
和 office
的取值標(biāo)準(zhǔn)不清楚,所以就沒寫,不過這個要加也就是在生成 result
那一步,創(chuàng)建 company
時加入節(jié)點信息即可,不會很難。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。