【问题标题】:JS getting union of all object keys from an array of objectsJS 从对象数组中获取所有对象键的联合
【发布时间】:2021-10-13 20:24:53
【问题描述】:

我有以下对象数组:

var all = [
{f1: "v1", f2: "v2"},
{f1: "v1", f2: "v2", f3: "v3"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4", fn: "vn"}
];

期望的输出:

[f1, f2, f3, f4, f5, ...., fn];

目前使用:

all.reduce((sum, item) => ([...new Set([...sum, ...Object.keys(item)])]), []);

工作示例:codepen

任何使用 es6 或任何新 js 功能的建议,以获得更好的性能。

【问题讨论】:

  • 目前还不是 100% 清楚您要实现的目标有 5 个来自 4 个对象的数组的结果。您是否正在尝试获取对象的最终密钥。订单有保障吗?
  • 还有一个选项:new Set(all.map(o => Object.keys(o)).flat())
  • @DamianGreen,所需的输出是“给定数组中最高键的键数组:值对对象”。
  • @FelixKling 会有更好的性能吗,因为我们有 4 个操作。
  • "desired output is "array of the keys of the heighest key:value pair object from the given array" 这与获取所有键的并集不同。它是什么现在?“它的性能会更好吗,因为我们有 4 个操作” 它不会像您的解决方案那样创建中间对象。但最终您必须实际测量不同的解决方案。

标签: javascript arrays object ecmascript-6


【解决方案1】:

您可以将它们压平成一个对象,然后取出钥匙。

var all = [
{f1: "v1", f2: "v2"},
{f1: "v1", f2: "v2", f3: "v3"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4"},
{f1: "v1", f2: "v2", f3: "v3", f4: "v4", fn: "vn"}
];

const output = Object.keys(Object.assign({}, ...all));
console.log(output);

【讨论】:

    【解决方案2】:
    var all = [
    {f1: "v1", f2: "v2"},
    {f1: "v1", f2: "v2", f3: "v3"},
    {f1: "v1", f2: "v2", f3: "v3", f4: "v4"},
    {f1: "v1", f2: "v2", f3: "v3", f4: "v4", fn: "vn"}
    ];
    
    console.log(Object.keys(all[all.length-1]))
    

    【讨论】:

    • 这假设数组中的最后一个元素包含所有键,并且可以忽略数组中的所有其他元素。目前尚不清楚这是一个安全的假设。
    • 不,数组的任何对象都可以有最多的键:值对,而不是最后一个。
    • 我知道,但是对于给定的输入,它显示了正确的结果,如果不问,为什么要关心 conercases?
    【解决方案3】:

    使用Array.flatMapSet 对象获取一组唯一键,然后使用spread operator 将组转换回数组。

    var all = [
    {f1: "v1", f2: "v2"},
    {f1: "v1", f2: "v2", f3: "v3"},
    {f1: "v1", f2: "v2", f3: "v3", f4: "v4"},
    {f1: "v1", f2: "v2", f3: "v3", f4: "v4", fn: "vn"}
    ];
    
    const res = [...new Set(all.flatMap(Object.keys))];
    console.log(res);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      相关资源
      最近更新 更多