当前位置: 首页 > 知识库问答 >
问题:

JS:如果所有嵌套值都等于null,则删除对象键

裴欣然
2023-03-14

根据给定的数据结构(json文件),我基本上需要呈现一个表。不应呈现空的行和/或列。我对JavaScript相当陌生,并尝试了不同的方法(转换为数组并使用.map()、reduce()。过滤器()和lodash等)没有成功。我甚至不知道解决这个问题的最佳方法是什么。(或者可能的搜索词是什么。)

行键(例如:mo、tu、we、th、fr)和列键(john、hane、doe)都不是已知的,并且可以变化。

完整示例:https://jsbin.com/rafeyasena/edit?js,输出

"groupA": {
    "mo": { "john": 8, "jane": 5, "doe": null },
    "tu": { "john": 8, "jane": 5, "doe": null },
    "we": { "john": 5, "jane": 9, "doe": null },
    "th": { "john": 6, "jane": 3, "doe": null },
    "fr": { "john": null, "jane": null, "doe": null }
  }

可能产生的数据结构

const header = ["John", "Jane"];
const content = [
 "mo": {[ 8, 5 ]},
 "tu": {[ 8, 5 ]},
 "we": {[ 5, 9 ]},
 "th": {[ 6, 3 ]}
]

预期结果(前端,反应):

   | John | Jane |
---|------|--------
mo |  8   |  5   |
tu |  8   |  5   |
we |  5   |  9   |
th |  6   |  3   |

到目前为止,我尝试过的是:如果不再包含键/值,我就能够删除null的所有值和相应的键(在嵌套的javascript对象中删除null值)——这让我面临一个挑战,即找出所有剩余键来构建表头。(在下面的例子中,这将只是John和Jane——因此基本上是一种迭代所有密钥并记录至少存在一次的每个密钥的方法)。所以我目前的数据是这样的(但我不确定这是否是最好的方式):

"groupA": {
    "mo": { "john": 8, "jane": 5, },
    "tu": { "john": 8, "jane": 5, },
    "we": { "john": 5, "jane": 9, },
    "th": { "john": 6, "jane": 3, }
  }

共有3个答案

丌官昊天
2023-03-14

看看物体扫描。一旦你了解了它的工作原理,这会使这类工作变得相对容易。下面是你如何回答问题的

// const objectScan = require('object-scan');

const isNullObject = (obj) => (
  obj instanceof Object
  && !Array.isArray(obj)
  && Object.values(obj).every((e) => e === null)
);

const prune = (data) => objectScan(['**'], {
  rtn: 'count',
  filterFn: ({ value, parent, property }) => {
    if (isNullObject(value)) {
      delete parent[property];
      return true;
    }
    return false;
  }
})(data);

const stats = { groupA: { mo: { john: 8, jane: 5, doe: null }, tu: { john: 8, jane: 5, doe: null }, we: { john: 5, jane: 9, doe: null }, th: { john: 6, jane: 3, doe: null }, fr: { john: null, jane: null, doe: null } } };

console.log(prune(stats)); // return number of replaces
// => 1

console.log(stats);
/* =>
  { groupA:
    { mo: { john: 8, jane: 5, doe: null },
      tu: { john: 8, jane: 5, doe: null },
      we: { john: 5, jane: 9, doe: null },
      th: { john: 6, jane: 3, doe: null } } }
*/
.as-console-wrapper {max-height: 100% !important; top: 0}
html lang-html prettyprint-override"><script src="https://bundle.run/object-scan@13.8.0"></script>
斜浩穰
2023-03-14

我认为创建后一种格式(删除空值)是非常有用的第一步。从那里您可以编写这样的内容以将其转换为目标格式的变体:

js lang-js prettyprint-override">const uniqKeys = (obj) => [... new Set(Object.values(obj).flatMap(Object.keys))]

const transform = (group, headers = uniqKeys(group)) => ({
  headers,
  content: Object.entries(group).reduce(
    (a, [k, v]) => ({...a, [k]: headers.map(h => v[h])}),
    {}
  )
})


const groupA = {mo: {john: 8, jane: 5}, tu: {john: 8, jane: 5}, we: {john: 5, jane: 9}, th: {john: 6, jane: 3}}

console.log(transform(groupA))
司迪
2023-03-14

我只想将数据表示为2D数组(这使渲染更容易):

 const columnNames = [""];
 const rows = [columnNames];

  for(const [rowName, values] of Object.entries(groupA)) {
     const row = [rowName];
     for(const [columnName, value] of Object.entries(values)) {
        let position = columnNames.indexOf(columnName);
        if(value === null) continue;
        if(position === -1)
          position = columnNames.push(columnName) - 1;
        row[position] = value;
     }
     rows.push(row);
 }

 // just some debugging:   
 console.log( rows.map(row => row.map(it => (it || "").padStart(10)).join("|")).join("\n") );
 类似资料:
  • 我有一个模型,在几个模型中设置为外键。现在从模型中删除任何对象时,如果该对象在这些模型中被引用,则会抛出ProtectedError。我想让用户在一次操作中删除包含所有受保护对象的对象。 我只需调用 但是当有自己的受保护对象时,操作失败并抛出另一层。我想要实现的是,删除所有受保护的对象,而不区分它存在于哪一层。我知道这可能是一个危险的操作。但我能在没有复杂解决方案的情况下实现这一点吗。提前谢谢。

  • 问题内容: 是否可以使elasticsearch中的所有嵌套对象自动映射为默认嵌套的类型。而不是对象? 问题答案: 是的,您可以在创建索引时使用以下动态模板来做到这一点:

  • 如果(tagrecord.gettagid()==null&&tagrecord.gettaglabel()==null),我实际上希望生成的方法返回一个null标记对象。有没有可能,我该如何实现这一点?

  • 我试图递归删除JSON对象和所有子对象中的空值。如果子对象的关键点都已删除,则我希望该子对象也被删除。 比如。 应该变成这样: 下面是我编写的删除所有空值键的函数: 但这不会删除没有子项的父项: 因此,我得到的不是上面的结果,而是: 如您所见,它不会删除申请人的密钥。我如何在函数中检查它?或者它是否需要编写在我调用delKeys()后调用的单独函数中? 还有,有人看到这达到了最大递归深度吗?我尝试

  • 我正在使用ElasticSearch5.4,试图从嵌套数据类型中删除一个元素。 我有以下映射: 我在《邮递员》中尝试过以下内容: localhost:9200/asset/bookmark/20976/_update?pretty 但我得到以下错误: 我在StackOverflow[1][2]的几个不同问题中遵循了这些建议,但没有成功。 嵌套对象是有效的,因为我已经用数据填充了它。此外,值也是有效