//实现a到b
a = [
[id = "1", member_id = "2", goods_id = "4"],
[id = "2", member_id = "3", goods_id = "5"],
[id = "3", member_id = "2", goods_id = "6"],
[id = "4", member_id = "3", goods_id = "7"],
[id = "5", member_id = "3", goods_id = "8"],
]
b = [
[member_id = "2", _child = [
[id = "1", goods_id = "4"],
[id = "3", goods_id = "6"],
]],
[member_id = "3", _child = [
[id = "2", goods_id = "5"],
[id = "4", goods_id = "7"],
[id = "5", goods_id = "8"],
]],
]
```javascript
/*请写个函数(调用函数1和函数2)(入参a,出参b。内部可以通过调用两个函数实现),
实现a转化成b。先生成一个树形结构(函数1),然后再跟据树形结构生成列表(函数2)
字段解释:id主键,pid父主键,path父子依赖路径*/
a = [
{ id: 1, pid: 0 },
{ id: 2, pid: 0 },
{ id: 3, pid: 1 },
{ id: 4, pid: 1 },
{ id: 5, pid: 4 },
{ id: 6, pid: 3 },
{ id: 7, pid: 5 },
{ id: 8, pid: 7 }
];
b = [
{id:1,pid:0,path:'-0-'},
{id:2,pid:0,path:'-0-'},
{id:3,pid:1,path:'-0-1-'},
{id:4,pid:1,path:'-0-1-'},
{id:5,pid:4,path:'-0-1-4-'},
{id:6,pid:3,path:'-0-1-3-'},
{id:7,pid:5,path:'-0-1-4-5-'},
{id:8,pid:7,path:'-0-1-4-5-7-'}
];
```
a = [
{ id: 1, pid: 0 },
{ id: 2, pid: 0 },
{ id: 3, pid: 1 },
{ id: 4, pid: 1 },
{ id: 5, pid: 4 },
{ id: 6, pid: 3 },
{ id: 7, pid: 5 },
{ id: 8, pid: 7 }
];
function getPids(arr, pid) {
var item, pids = '';
while (item = arr.find(i => i.id == pid)) {
pid = item.pid;
pids = '-' + pid + pids ;
}
return pids;
}
function getB(a) {
var b = [];
a.forEach(i => {
var path = getPids(a, i.pid) + '-' + i.pid + '-';
var item = { id: i.id, pid: i.pid, path: path };
b.push(item);
});
return b;
}
var b = getB(a);
console.log(b)
一定要转嵌套后再转b类型的数组用下面的,path正确,但是循序会不一样,
function FlatToNested(data) {//树数据源扁平结构转嵌套
var idFiled = 'id';
var parentField ='pid';
var i, l, treeData = [], tmpMap = [];
for (i = 0, l = data.length; i < l; i++) tmpMap[data[i][idFiled]] = data[i];
for (i = 0, l = data.length; i < l; i++) {
if (tmpMap[data[i][parentField]] && data[i][idFiled] != data[i][parentField]) {
if (!tmpMap[data[i][parentField]]['children'])
tmpMap[data[i][parentField]]['children'] = [];
tmpMap[data[i][parentField]]['children'].push(data[i]);
} else {
treeData.push(data[i]);
}
}
return treeData;
}
function NestedToFlat(children, pid, path) {//树数据源嵌套结构转扁平
var arr = [];
if (!path) path = `-${pid}-`;
else path += `${pid}-`;
for (var i = 0; i < children.length; i++) {
arr.push({ id: children[i].id, pid: pid, path: path })
if (children[i].children) arr = arr.concat(NestedToFlat(children[i].children, children[i].id, path));
}
return arr;
}
a = [
{ id: 1, pid: 0 },
{ id: 2, pid: 0 },
{ id: 3, pid: 1 },
{ id: 4, pid: 1 },
{ id: 5, pid: 4 },
{ id: 6, pid: 3 },
{ id: 7, pid: 5 },
{ id: 8, pid: 7 }
];
var b = FlatToNested(a);
b = NestedToFlat(b, 0);
//b.sort((a, b) => { return a.path.localeCompare(b.path) });//这里可以增加排序得到和第一种方法一样的结果
console.log(b)