一维数组和多维数组的转换

一维数组和多维数组的转换

一维数组转多维数组

// idsysarea 表示父级元素
const arr = [
{
id: 110000, // 省市县id,
idsysarea: 100000, // 上级id
mergername: "北京",
name: "北京", // 省市县名称"
},
{
id: 110100,
idsysarea: 110000,
mergername: "北京,北京市",
name: "北京市",
},
{
id: 110101,
idsysarea: 110100,
mergername: "北京,北京市,东城区",
name: "东城区",
},
{
id: 110102,
idsysarea: 110100,
mergername: "北京,北京市,西城区",
name: "西城区",
},
{
id: 110105,
idsysarea: 110100,
mergername: "北京,北京市,朝阳区",
name: "朝阳区",
},
{
id: 120000,
idsysarea: 100000,
mergername: "天津",
name: "天津",
},
{
id: 120100,
idsysarea: 120000,
mergername: "天津,天津市",
name: "天津市",
},
{
id: 120101,
idsysarea: 120100,
mergername: "天津,天津市,和平区",
name: "和平区",
},
{
id: 120102,
idsysarea: 120100,
mergername: "天津,天津市,河东区",
name: "河东区",
},
{
id: 120103,
idsysarea: 120100,
mergername: "天津,天津市,河西区",
name: "河西区",
},
];
function arrToTree(data) {
const result = [];
const obj = {};
// 第一次类似浅拷贝赋值 两次浅拷贝导致data和obj相互影响
data.forEach(item => {
obj[item.id] = item;
});
data.forEach(item => {
// 这儿需要注意item的父级是obj[item.idsysarea]
// 第二次类似浅拷贝赋值
const parent = obj[item.idsysarea];
if (!parent) {
// 找出父级
result.push(obj[item.id]); // 直接item也可以
return;
}
// 表示这个项存在父级
// 即使原来的父级还没创建,由于浅拷贝data和obj上的数据还是会受到影响
(parent.children || (parent.children = [])).push(item);
});
return result;
}
console.log(arrToTree(arr));

多维数组转一维

const arr = [
{
id: 110000,
idsysarea: 100000,
mergername: "北京",
name: "北京",
children: [
{
id: 110100,
idsysarea: 110000,
mergername: "北京,北京市",
name: "北京市",
children: [
{
children: [],
id: 110101,
idsysarea: 110100,
mergername: "北京,北京市,东城区",
name: "东城区",
},
{
children: [],
id: 110102,
idsysarea: 110100,
mergername: "北京,北京市,西城区",
name: "西城区",
},
{
children: [],
id: 110105,
idsysarea: 110100,
mergername: "北京,北京市,朝阳区",
name: "朝阳区",
},
],
},
],
},
{
id: 120000,
idsysarea: 100000,
mergername: "天津",
name: "天津",
children: [
{
id: 120100,
idsysarea: 120000,
mergername: "天津,天津市",
name: "天津市",
children: [
{
children: [],
id: 120101,
idsysarea: 120100,
mergername: "天津,天津市,和平区",
name: "和平区",
},
{
children: [],
id: 120102,
idsysarea: 120100,
mergername: "天津,天津市,河东区",
name: "河东区",
},
{
children: [],
id: 120103,
idsysarea: 120100,
mergername: "天津,天津市,河西区",
name: "河西区",
},
],
},
],
},
];
function deepArr(data) {
if (!Array.isArray(data)) {
return data;
}
const newArr = [];
data.forEach(item => {
if (!item.children) {
return newArr.push(item);
}
const obj = JSON.parse(JSON.stringify(item));
delete obj.children;
newArr.push(obj);
newArr.push(...deepArr(item.children));
});
return newArr;
}
console.log(deepArr(arr));

  • 方法 2

    function changeArr(data) {
    let result = [];
    function getChildrens(item) {
    let arr = [];
    if (item.children && item.children.length) {
    arr = arr.concat(item.children);
    item.children.forEach(el => {
    arr = arr.concat(getChildrens(el));
    });
    }
    return arr;
    }

    data.forEach(item => {
    result.push(item);
    result = result.concat(getChildrens(item));
    });
    return result;
    }
    console.log(changeArr(arr));

posted @ 2022-08-04 17:46  不完美的完美  阅读(366)  评论(0)    收藏  举报