简体   繁体   English

将多维数组转换为对象的分组数组

[英]Transforming multi-dimensional array into grouped array of objects

I have a multidimensional array as below (columns) and need it transformed into array of objects forming a grouped hierarchal structure to construct a table header.我有一个如下所示的多维数组(列),需要将其转换为对象数组,形成一个分组的层次结构来构造一个表 header。

Each values has to be nested in the order of index and also grouped.每个值都必须按索引顺序嵌套并分组。 Any pointers how this can be achieved?任何指针如何实现这一点?

var columns = [
        ["Price", "Australia", "Melbourne", "Comfort Hotel & Spa"],
        ["Price", "Costa Rica", "Tamarindo", "Summer Isle Hotel"],
        ["Stars", "Fiji", "Suva", "Crescent Resort1"],
        ["Stars", "Fiji", "Suva", "Crescent Resort2"],
    ];

//need it to be transformed into structure like this
var transformedArray = [{
    Header: 'Price',
    columns: [{
        Header: 'Australia',
        columns: [{
            Header: 'Melbourne',
            columns: [{
                Header: 'Comfort Hotel & Spa',
                value: 'Price-Australia-Melbourne-Comfort Hotel & Spa'
            }]
        }]
    }, {
        Header: 'Costa Rica',
        columns: [{
            Header: 'Tamarindo',
            columns: [{
                Header: 'Summer Isle Hotel',
                value: 'Price-Costa Rica-Tamarindo-Summer Isle Hotel'
            }]
        }]
    }]
}, {
    Header: 'Stars',
    columns: [{
        Header: 'Fiji',
        columns: [{
            Header: 'Suva',
            columns: [{
                    Header: 'Crescent Resort1',
                    value: 'Stars-Fiji-suva-Crescent Resort1'
                },
                {
                    Header: 'Crescent Resort2',
                    value: 'Stars-Fiji-suva-Crescent Resort2'
                }
            ]
        }]
    }]
}]

You can use nested reduce() calls to build the structure of each object, reserving out the last element of each array to push into the innermost columns array returned by the inner reduce()您可以使用嵌套的reduce()调用来构建每个 object 的结构,保留每个数组的最后一个元素以推入内部reduce()返回的最里面的columns数组

 var input = [["Price", "Australia", "Melbourne", "Comfort Hotel & Spa"], ["Price", "Costa Rica", "Tamarindo", "Summer Isle Hotel"], ["Stars", "Fiji", "Suva", "Crescent Resort1"], ["Stars", "Fiji", "Suva", "Crescent Resort2"],]; const output = input.reduce((a, arr) => { const leafValue = arr.join('-'), leafHeader = arr.pop(); const inner = arr.reduce((b, e) => ( b.push({ Header: e, columns: [] }), b[b.length - 1].columns), a) inner.push({ Header: leafHeader, value: leafValue }); return a; }, []) console.log(JSON.stringify(output, null, 2));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM