从多个表中过滤并删除空列
Posted
技术标签:
【中文标题】从多个表中过滤并删除空列【英文标题】:filter and remove empty columns from multiple table 【发布时间】:2022-01-22 11:04:42 【问题描述】:我正在使用tty-table 插件在我的控制台应用程序中打印表格
表格的实际结果包含许多列,其中一些包含“0”作为数据,请参见下面的示例
Product | Stock | Country | Price |
---|---|---|---|
Samsung S20 | 0 | Germany | 0 |
Iphone 13 | 0 | England | 0 |
Samsung A71 | 0 | US | 0 |
SOne | 0 | UK | 0 |
我想隐藏所有行的数据为 0 的列。 结果应该是:
Product | Country |
---|---|
Samsung S20 | Germany |
Iphone 13 | England |
Samsung A71 | US |
SOne | UK |
在我的代码中,每一行都是一个数组,所以行的结果是一个数组数组:示例
[
["Samsung S20",0,"Germany",0],
["Iphone 13",0,"England",0],
["Samsung A71",0,"US",0],
["SOne",0,"UK",0],
]
你能帮我做这样的事情吗:
[
["Samsung S20","Germany"],
["Iphone 13","England"],
["Samsung A71","US"],
["SOne","UK"],
]
重要提示:表头是一个对象数组:
[value:"Product" , value:"Stock" ,value:"Country" ,value:"Price"
列的外观取决于它们在标题数组中的存在
【问题讨论】:
【参考方案1】:可能有一种更简单的方法,但一种选择是构建一个不包括零和列的表,然后提取标题和行以输入 tty-table:
let headers = [
value: "Product" ,
value: "Stock" ,
value: "Country" ,
value: "Price"
]
let rows = [
["Samsung S20", 0, "Germany", 0],
["Iphone 13", 0, "England", 0],
["Samsung A71", 0, "US", 0],
["SOne", 0, "UK", 0],
]
let table = headers
.map((h, index) => (header: h.value, values: rows.map(sub => sub[index])))
.filter(item => item.values.reduce((a, b) => a + b, 0) !== 0)
let newHeaders = table.map(item => (value: item.header))
let tableRows = table.map(arr => arr.values)
let newRows = tableRows[0].map((_, c) => tableRows.map(row => row[c]))
console.log(newHeaders)
console.log(newRows)
【讨论】:
不错的方法,但是在您的代码中,如果列的所有行都为零,您将删除标题,我认为这是正确的,但是当您创建newRows
时,您正在删除如果项目是 0
,则从单行中提取列。这意味着如果您有一列除了具有1
的一行之外,所有的列都包含0
s,那么该列的标题仍然存在,但每一行都有一个零将被删除并因此“转移”到左一。我还建议的一个小改动是将第一个和最后一个 reduce
方法与 .map()
交换,因为您正在有效地使用两者进行映射操作
感谢@NickParsons!接得好。我已经更新了我的答案。以上是关于从多个表中过滤并删除空列的主要内容,如果未能解决你的问题,请参考以下文章