4 回答

TA貢獻1886條經驗 獲得超2個贊
最短的方法是迭代嵌套名稱并查找具有相同名稱的對象。如果不存在,則創建一個新對象。將數組返回children
為新級別。
此方法的特點Array#reduce
是迭代外部數組data
和所有內部數組。
const
? ? data = [["marketing", "page_sections", "PageOne"], ["marketing", "page_sections", "PageTwo"], ["webapp", "page", "pageone"], ["webapp", "page", "pagetwo"]],
? ? result = data.reduce((r, names) => {
? ? ? ? names.reduce((level, name, i, values) => {
? ? ? ? ? ? let temp = level.find(q => q.name === name),
? ? ? ? ? ? ? ? path = values.slice(0, i + 1).join('/') + (i ? '' : '/');
? ? ? ? ? ? if (!temp) level.push(temp = { name, path, children: [] });
? ? ? ? ? ? return temp.children;
? ? ? ? }, r);
? ? ? ? return r;
? ? }, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

TA貢獻1854條經驗 獲得超8個贊
查看來源以及您的預期結果。
我要做的是循環list,然后在列表中進行另一個循環。將此與Array.find..混合
例如..
const data = {list:[
["marketing","page_sections","PageOne"],
["marketing","page_sections","PageTwo"],
["webapp","page","pageone"],
["webapp","page","pagetwo"]]};
function makeTree(src) {
const root = [];
for (const s of src) {
let r = root;
let path = '';
for (const name of s) {
path += `${name}/`;
let f = r.find(k => k.name === name);
if (!f) r.push(f = {name, path, children: []});
r = f.children;
}
}
return root;
}
console.log(makeTree(data.list));
.as-console-wrapper {
min-height: 100%;
}

TA貢獻1865條經驗 獲得超7個贊
您可以執行以下操作,
list= [
[
"marketing",
"page_sections",
"PageOne"
],
[
"marketing",
"page_sections",
"PageTwo"
],
[
"webapp",
"page",
"pageone"
],
[
"webapp",
"page",
"pagetwo"
],
];
getChildrenItem = (arr) => {
if(arr.length === 1) {
return { name: arr[0], children: []};
} else {
return { name: arr.splice(0,1)[0], children: [getChildrenItem([...arr])]};
}
}
merge = (srcArr, newObj) => {
const {name, children} = newObj;
let index = srcArr.findIndex(item => item.name === name);
if( index> -1) {
children.forEach(item => merge(srcArr[index].children, item))
return ;
} else {
srcArr.push(newObj);
return;
}
}
allObj = [];
list.forEach(item => {
let tempObj = getChildrenItem([...item]);
merge(allObj, tempObj);
});
console.log(allObj);

TA貢獻1875條經驗 獲得超3個贊
如果性能是一個問題,我認為這是最好的解決方案之一。
let list = [
["marketing", "page_sections", "PageOne"],
["marketing", "page_sections", "PageTwo"],
["webapp", "page", "pageone"],
["webapp", "page", "pagetwo"],
];
const dt = {};
const pushToOBJ = (Object, name) => {
if (Object[name]) return Object[name];
Object[name] = {
name,
children: {},
};
return Object[name];
};
for (let i = 0; i < list.length; i++) {
let subArray = list[i];
let st = pushToOBJ(dt, subArray[0]);
for (let j = 1; j < subArray.length; j++) {
st = pushToOBJ(st.children, subArray[j]);
}
}
let result = [];
const convertObjToChildArray = (obj) => {
if (obj === {}) return [];
let arr = Object.values(obj);
for (let i = 0; i < arr.length; i++) {
arr[i].children = convertObjToChildArray(arr[i].children);
}
return arr;
};
result = convertObjToChildArray(dt);
console.log(result);
沒有使用 JS find 函數,該函數已經具有 O(n) 復雜度。
添加回答
舉報