亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

合并基于子數組索引的數組數組作為鍵(NodeJS/Javascript)

合并基于子數組索引的數組數組作為鍵(NodeJS/Javascript)

慕妹3242003 2023-12-14 14:36:24
如何編寫代碼以以下方式合并我的列表?性能很重要。我想轉換以下數組:"list": [    [        "marketing",        "page_sections",        "PageOne"    ],    [        "marketing",        "page_sections",        "PageTwo"    ],    [        "webapp",        "page",        "pageone"    ],    [        "webapp",        "page",        "pagetwo"    ],改成下面的格式:[       {     name: "marketing",     path: "marketing/",                children: [                    {                        name: "page_sections",                        path: "marketing/page_sections",                         children: [                            {                                name: "pageOne",                                path: "marketing/page_sections/pageOne",                                 children: []                            },                            {                                name: "pageTwo",                                path: "marketing/page_sections/pageTwo",                                 children: []                            },                       }           ],     },    {     name: "webapp",     path: "webapp/"     children: [                  {                    name: "page",                    path: "webapp/page/"                                        children: [                        {                            name: "pageone",                            path: "webapp/page/pageone"                            children: []                        },                        {                            name: "pagetwo",                            path: "webapp/page/pagetwo"                            children: []                        },                    }             ]     },]子數組的第一個索引是父級,第二個索引是父級的子級,第三個索引是第二個索引的子級(依此類推)。
查看完整描述

4 回答

?
MM們

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; }


查看完整回答
反對 回復 2023-12-14
?
嗶嗶one

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%;

}


查看完整回答
反對 回復 2023-12-14
?
鴻蒙傳說

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);


查看完整回答
反對 回復 2023-12-14
?
翻過高山走不出你

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) 復雜度。


查看完整回答
反對 回復 2023-12-14
  • 4 回答
  • 0 關注
  • 247 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號