【问题标题】:Transforming multi-dimensional array into grouped array of objects将多维数组转换为对象的分组数组
【发布时间】:2021-04-23 01:40:05
【问题描述】:

我有一个如下所示的多维数组(列),需要将其转换为对象数组,形成一个分组的层次结构来构造表头。

每个值都必须按索引顺序嵌套并分组。任何指针如何实现这一点?

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'
                }
            ]
        }]
    }]
}]

【问题讨论】:

    标签: javascript arrays json multidimensional-array nested-loops


    【解决方案1】:

    您可以使用嵌套的reduce()调用来构建每个对象的结构,保留每个数组的最后一个元素以推入由内部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));

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 1970-01-01
      • 2021-12-28
      • 2016-11-28
      • 2012-11-14
      • 1970-01-01
      • 2020-11-10
      • 2015-10-22
      相关资源
      最近更新 更多