繁体   English   中英

将 excel 2D 数组转换为包含列名的嵌套属性对象

[英]Transform excel 2D array into nested properties object with column names included

我有一个 Excel 文件,如下所示:

[["Country", "City", "Zip"], ["CNTR1", "CT1", 101], ["CNTR1", "CT2", 102], ["CNTR2", "CT3", 103]]

以上是Excel 4行的二维数组解释。 我想从上面得到以下对象:

{
    level1: "Country",
    items: [{
        "CNTR1": {
            level2: "City",
            items: [{
                "CT1": {
                    level3: "Zip",
                    items: [
                        "101"
                    ]
                }
            }, {
                "CT2": {
                    level3: "Zip",
                    items: [
                        "102"
                    ]
                }
            }]
        }
    }, {
        "CNTR2": {
            level2: "City",
            items: [{
                "CT3": {
                    level3: "Zip",
                    items: [
                        "103"
                    ]
                }
            }]
        }
    }]
}

主要目的是要有一个层次结构,因为上面的 Excel 应该有一个从左到右的依赖关系,因为这些值将用于依赖下拉列表(所以如果我们有国家“CNTR1”,所有城市和邮政编码都应该是它的一部分对象,因为在国家下拉列表中选择“CNTR1”后,只有 CT1 和 CT2 应显示在城市下拉列表中,邮政编码依此类推),并且基于此依赖性,我们应该具有每个嵌套级别的子值. 此外,上述内容不应仅限于三层深度,因此它应该是带有减速器/递归解决方案的东西。

如果有人有更好的对象模式解决方案,因为以上是我认为适合依赖下拉列表的目的,同时还可以检索列名,请随时分享。 下拉列表将是动态的,依赖于从左到右的列,值基于相同的“更高”层次结构值。

希望它足够清楚。

到目前为止,我有:

items.map(row => row.reduceRight((value, key) => ({[key]: value}))).reduce((acc, value) => (Object.assign(acc, value)))

但这只是给出了以下类型的结果:

{
  "CNTR1": {
    "CT2": 102
  },
  "CNTR2": {
    "CT3": 103
  }
}

(忽略嵌套属性数据的丢失,因为合并不深)不包括列的名称,并且对于指定的目的而言,数据结构似乎有点差。

谢谢

您可以使用reduce方法创建类似的结构,方法是从数组中的第一个元素开始切片,然后从数组中的第一个元素获取当前级别。

 const data = [["Country", "City", "Zip"], ["CNTR1", "CT1", 101], ["CNTR1", "CT2", 102], ["CNTR2", "CT3", 103]] function build(data, level) { return data.slice(1).reduce((r, a) => { a.reduce((ac, e, i, arr) => { ac.level = data[0][i] if (arr[i + 1]) ac[e] = (ac[e] || {}) else ac.value = e; return ac[e]; }, r) return r }, {}) } const result = build(data); console.log(result)

您可以通过减少嵌套数组来减少数组并构建所需的结构。 并重新调整内部items数组。

 var data = [["Country", "City", "Zip"], ["CNTR1", "CT1", 101], ["CNTR1", "CT2", 102], ["CNTR2", "CT3", 103]], result = data.reduce((r, [...a], i, { [0]: header }) => { var last = a.pop(); if (i === 1) r = { level1: header[0], items: [] }; a.reduce((items, k, i) => { var temp = items.find(q => k in q); if (!temp) items.push(temp = { [k]:{ ['level' + (i + 2)]: header[i + 1], items: [] } }); return temp[k].items; }, r.items).push(last); return r; }); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

暂无
暂无

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

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