[英]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.