Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象数组重构_Javascript_Multidimensional Array - Fatal编程技术网

Javascript对象数组重构

Javascript对象数组重构,javascript,multidimensional-array,Javascript,Multidimensional Array,我从连接了3个表的关系数据库中获取数据: var btnObj2 = [ {sect_id: 1, sect_title: 'Navigation', subsect_id: 1, subsect_title:'Übersicht', btn_id: 1, btn_title: 'Inhaltsverzeichnis'}, {sect_id: 1, sect_title: 'Navigation', subsect_id: 1, subsect_title: 'Übersicht', btn_i

我从连接了3个表的关系数据库中获取数据:

var btnObj2 = [
{sect_id: 1, sect_title: 'Navigation', subsect_id: 1, subsect_title:'Übersicht', btn_id: 1, btn_title: 'Inhaltsverzeichnis'},
{sect_id: 1, sect_title: 'Navigation', subsect_id: 1, subsect_title: 'Übersicht', btn_id: 2, btn_title: 'Stichwortverzeichnis'},
{sect_id: 1, sect_title: 'Navigation', subsect_id: 2, subsect_title: 'Praxisphasen', btn_id: 3, btn_title: 'Trainingserfolg'},
{sect_id: 1, sect_title: 'Navigation', subsect_id: 2, subsect_title: 'Praxisphasen', btn_id: 4, btn_title: 'Trainingsablauf'},
{sect_id: 2, sect_title: 'Modul 1', subsect_id: 3, subsect_title: 'Mentor-Gespräche', btn_id: 5, btn_title: 'Lebenszeit'},
{sect_id: 2, sect_title: 'Modul 1', subsect_id: 3, subsect_title: 'Mentor-Gespräche', btn_id: 6, btn_title: 'Lebensplanung'},
{sect_id: 2, sect_title: 'Modul 1', subsect_id: 4, subsect_title: 'Just do it', btn_id: 7, btn_title: 'Vertrauen'},
{sect_id: 2, sect_title: 'Modul 1', subsect_id: 4, subsect_title: 'Just do it', btn_id: 8, btn_title: 'Verantwortung'}
];
此数据必须重新构造,以便每个节包含其子节,每个子节包含其子节子节子节是上面代码段中的按钮。数据库中的数据已经按照节、子节、子节的正确顺序返回

输出必须如下所示:

var result = [
{
    sect_id: 1,
    sect_title: 'Navigation',
    subsect: [
        {
            subsect_id: 1,
            subsect_title: 'Übersicht',
            buttons: [
                {
                    btn_id: 1,
                    btn_title: 'Verantwortung'
                },
                {
                    btn_id: 2,
                    btn_title: 'Vertrauen'
                }
            ]
        },
        {
            subsect_id: 2,
            subsect_title: 'Praxisphasen',
            buttons: [
                {
                    btn_id: 3,
                    btn_title: 'Trainingserfolg'
                },
                {
                    btn_id: 4,
                    btn_title: 'Trainingsablauf'
                }
            ]
        }
    ]
},
sect_id: 2,
sect_title: 'Module 1',
//.....
];
下面是我将如何用PHP的方式来实现它:

function prepareBtns(arr) {
    var sectId, subsectId = ''
    var newArr = []
    arr.forEach((item) => {
        if(sectId !== item.sect_id){
            sectId = item.sect_id
        }
        if(subsectId !== item.subsect_id){
            subsectId = item.subsect_id
        }
        //In PHP the following line does the Job
        newArr[sectId][subsectId][] = item
    })
    return newArr
}
这是我的JS测试之一。这一个导致了空插槽:

function prepareBtnsXY(arr) {
var newArr = [];
arr.forEach((item) => {
    if (!newArr[item.sect_id]) {

        var objToPush = {
            sectId: item.sect_id,
            sectName: item.sect_title,
            subsect: []
        };
        newArr[item.sect_id] = objToPush;
    }

    if (!newArr[item.sect_id].subsect[item.subsect_id]) {
        var subObjToPush = {
            subsectId: item.subsect_id,
            subsectName: item.subsect_title,
            buttons: []
        };
        newArr[item.sect_id].subsect[item.subsect_id] = subObjToPush;
    }

    if (!newArr[item.sect_id].subsect[item.subsect_id].buttons[item.btn_id]) {
        var btnObjToPush = {
            btnId: item.btn_id,
            btnName: item.btn_title
        };
        newArr[item.sect_id].subsect[item.subsect_id].buttons[item.btn_id] = btnObjToPush;
    }
});

return newArr
}

您可以通过以下方式获得所需的结果:

设r={},data=[{sect_id:1,sect_title:'Navigation',subsect_id:1,subsect_title:'bersicht',btn_id:1,btn_title:'inhaltsverzeichis',{sect id:1,sect_title:'Navigation',subsect id:1,subsectÜu title:'bersicht',btn_id:2,btn_title:'stichwortverzeichis',{sect_id:1,sect_title:'导航',subsect_id:2,subsect_title:'实践阶段',btn_id:3,btn_title:'培训人员'},{sect_id:1,sect_title:'导航',subsect_id:2,subsect_title:'实践阶段',btn_id:4,btn_title:'培训人员'},{sect_id:2,sect_title:'Modul 1',subsect_id:3,subsect_title:'Mentor Gespräche',btn_id:5,btn_title:'Lebenszeit'},{sect sect id:2,sect_title:'Modul 1',subsect id:3,subsect title:'Mentor Gespräche btnäid:6,btn_title:'Lebensplanung'},{sect_id:2,sect_title:'Modul 1',subsect_id:4,subsect_title:'Just do it',btn_id:7,btn_title:'Vertrauen'},{sect sect_id:2,sect_title:'Modul 1',subsect id:4,subsect_title:'Just do it',btn_id:8,btn_title:'Verantwortung'}]; 而data.length{ 设{sect_id,sect_title,subsect_id,subsect_title,btn_id,btn_title}=data.pop, subsect={subsect\u id,subsect\u title,按钮:[{btn\u id,btn\u title}]} if!r[门派id] r[sect_id]={sect_id,sect_title,subsect:[subsect]} 否则{ 设sub=r[sect_id]。subsect.findx=>x.subsect_id==subsect_id ifsub.buttons.按钮{btn_id,btn_title} else r[sect_id]。subsect.pushsubsect } }
console.logObject.valuesr您可以通过以下方式获得所需的结果:

设r={},data=[{sect_id:1,sect_title:'Navigation',subsect_id:1,subsect_title:'bersicht',btn_id:1,btn_title:'inhaltsverzeichis',{sect id:1,sect_title:'Navigation',subsect id:1,subsectÜu title:'bersicht',btn_id:2,btn_title:'stichwortverzeichis',{sect_id:1,sect_title:'导航',subsect_id:2,subsect_title:'实践阶段',btn_id:3,btn_title:'培训人员'},{sect_id:1,sect_title:'导航',subsect_id:2,subsect_title:'实践阶段',btn_id:4,btn_title:'培训人员'},{sect_id:2,sect_title:'Modul 1',subsect_id:3,subsect_title:'Mentor Gespräche',btn_id:5,btn_title:'Lebenszeit'},{sect sect id:2,sect_title:'Modul 1',subsect id:3,subsect title:'Mentor Gespräche btnäid:6,btn_title:'Lebensplanung'},{sect_id:2,sect_title:'Modul 1',subsect_id:4,subsect_title:'Just do it',btn_id:7,btn_title:'Vertrauen'},{sect sect_id:2,sect_title:'Modul 1',subsect id:4,subsect_title:'Just do it',btn_id:8,btn_title:'Verantwortung'}]; 而data.length{ 设{sect_id,sect_title,subsect_id,subsect_title,btn_id,btn_title}=data.pop, subsect={subsect\u id,subsect\u title,按钮:[{btn\u id,btn\u title}]} if!r[门派id] r[sect_id]={sect_id,sect_title,subsect:[subsect]} 否则{ 设sub=r[sect_id]。subsect.findx=>x.subsect_id==subsect_id ifsub.buttons.按钮{btn_id,btn_title} else r[sect_id]。subsect.pushsubsect } }
console.logObject.valuesr您可以将所需的键存储在另一个数组中,其中每行的第一个键是用于分组的键值,以下键是此级别的数据键,最后一个键是用于子/子级别的。最终数组不包含子值,但包含未定义的占位符

该算法通过获取实际数组并搜索相同的分组键和值来迭代数据并减少键。如果未找到,则使用给定的键生成一个新级别,并将其推送到数组,然后返回下一级别的子数组

这种方法的优点是,只需更改原始数据和相应的键数组(充当分组规则集)即可轻松维护

var数据=[{sect_id:1,sect_title:'Navigation',subsect_id:1,subsect_title:'berscht',btn_id:1,btn_title:'inhaltsverzeichis',{sect id:1,sect_title:'Navigation',subsect id:1,subsect_title:'berscht',btn_id:2,btn_title:'Stichwortverzeichnis',{sect_id:1,sect_title:'Navigation',subsect_id:2,subsect_title:'Praxisphasen',btn_id:3,btn_title:'Trainingserfolg'},{sect sect id:1,sect_title:'Navigation',subsect id:2,subsect_title:'Praxisphasen,btn_id:4,btn_title:'trainingsabauf' 第二节,第二节,第三节,第三节,第三节,第三节,第六节,第二节,第二节,第四节,第三节,第三节,第三节,第六节,第二节,第二节,第四节,第七节,第三节,{sect_id:2,sect_title:'Modul 1',subsect_id:4,subsect_title:'Just do it',btn_id:8,btn_title:'Verantwortung'}], 键=['sect_id'、'sect_title'、'subsect_id'、'subsect_title'、'buttons']、['btn_id'、'btn_title',未定义]], 结果=data.reducer,o=>{ keys.reducea,k=>{ var temp=a.findp=>o[k[0]==p[k[0]]; 如果!临时{ a、 pushtemp=Object.assign …k.mapl,i,{length}=> l&&{[l]:i+1==长度?[]:o[l]} ; } 返回温度[k[k.长度-1]]; },r; 返回r; }, []; console.logresult;
.作为控制台包装{最大高度:100%!重要;顶部:0;}您可以将所需的键存储在另一个数组中,其中每行的第一个键是用于分组的键值,以下键是此级别的数据键,最后一个键是用于子/子级别的。最后一个数组不包含子值,但包含未定义的占位符

该算法通过获取实际数组并搜索相同的分组键和值来迭代数据并减少键。如果未找到,则使用给定的键生成一个新级别,并将其推送到数组,然后返回下一级别的子数组

这种方法的优点是,只需更改原始数据和相应的键数组(充当分组规则集)即可轻松维护

var数据=[{sect_id:1,sect_title:'Navigation',subsect_id:1,subsect_title:'berscht',btn_id:1,btn_title:'inhaltsverzeichis',{sect id:1,sect_title:'Navigation',subsect id:1,subsect_title:'berscht',btn_id:2,btn_title:'Stichwortverzeichnis',{sect_id:1,sect_title:'导航',subsect_id:2,subsect_title:'实践阶段',btn_id:3,btn_title:'培训人员'},{sect_id:1,sect_title:'导航',subsect_id:2,subsect_title:'实践阶段',btn_id:4,btn_title:'培训人员'},{sect_id:2,sect_title:'Modul 1',subsect_id:3,subsect_title:'Mentor Gespräche',btn_id:5,btn_title:'Lebenszeit'},{sect sect id:2,sect_title:'Modul 1',subsect id:3,subsect title:'Mentor Gespräche btnäid:6,btn_title:'Lebensplanung'},{sect_id:2,sect_title:'Modul 1',subsect_id:4,subsect_title:'Just do it',btn_id:7,btn_title:'Vertrauen'},{sect sect_id:2,sect_title:'Modul 1',subsect id:4,subsect_title:'Just do it',btn_id:8,btn_title:'Verantwortung'}, 键=['sect_id'、'sect_title'、'subsect_id'、'subsect_title'、'buttons']、['btn_id'、'btn_title',未定义]], 结果=data.reducer,o=>{ keys.reducea,k=>{ var temp=a.findp=>o[k[0]==p[k[0]]; 如果!临时{ a、 pushtemp=Object.assign …k.mapl,i,{length}=> l&&{[l]:i+1==长度?[]:o[l]} ; } 返回温度[k[k.长度-1]]; },r; 返回r; }, []; console.logresult;
.作为控制台包装{max height:100%!important;top:0;}您可以发布预期的输出吗?您可以发布预期的输出吗?
keys = [
  //  level key          level  properties        children
  // ------------  ----------------------------- ----------
    ['sect_id',    'sect_title' /* more keys */, 'subsect'],
    ['subsect_id', 'subsect_title',              'buttons'],
    ['btn_id',     'btn_title',                  undefined]
],