从多个表中过滤并删除空列

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 的一行之外,所有的列都包含0s,那么该列的标题仍然存在,但每一行都有一个零将被删除并因此“转移”到左一。我还建议的一个小改动是将第一个和最后一个 reduce 方法与 .map() 交换,因为您正在有效地使用两者进行映射操作 感谢@NickParsons!接得好。我已经更新了我的答案。

以上是关于从多个表中过滤并删除空列的主要内容,如果未能解决你的问题,请参考以下文章

如何跨多个模式从表中删除分区?

使用 Excel VBA 从包括空列在内的多个列表生成组合

在一个灵活的查询中从多个表中删除行

如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项

使用jQuery删除html表中的空列

从多个 Access 表中删除记录