返回介绍

solution / 2600-2699 / 2675.Array of Objects to Matrix / README

发布于 2024-06-17 01:03:01 字数 3592 浏览 0 评论 0 收藏 0

2675. 将对象数组转换为矩阵

English Version

题目描述

编写一个函数,将对象数组 arr 转换为矩阵 m 。

arr 是一个由对象组成的数组或一个数组。数组中的每个项都可以包含深层嵌套的子数组和子对象。它还可以包含数字、字符串、布尔值和空值。

矩阵 m 的第一行应该是列名。如果没有嵌套,列名是对象中的唯一键。如果存在嵌套,列名是对象中相应路径,以点号 "." 分隔。

剩余的每一行对应 arr 中的一个对象。矩阵中的每个值对应对象中的一个值。如果给定对象在给定列中没有值,则应该包含空字符串 ""

矩阵中的列应按 字典序升序 排列。

 

示例 1:

输入:
arr = [
  {"b": 1, "a": 2},
  {"b": 3, "a": 4}
]
输出:
[
  ["a", "b"],
  [2, 1],
  [4, 3]
]

解释:
两个对象中有两个唯一的列名:"a"和"b"。 
"a"对应[2, 4]。 
"b"对应[1, 3]。

示例 2:

输入:
arr = [
  {"a": 1, "b": 2},
  {"c": 3, "d": 4},
  {}
]
输出:
[
  ["a", "b", "c", "d"],
  [1, 2, "", ""],
  ["", "", 3, 4],
  ["", "", "", ""]
]

解释:
有四个唯一的列名:"a"、"b"、"c"、"d"。 
 第一个对象具有与"a"和"b"关联的值。 
第二个对象具有与"c"和"d"关联的值。 
第三个对象没有键,因此只是一行空字符串。

示例 3:

输入:
arr = [
  {"a": {"b": 1, "c": 2}},
  {"a": {"b": 3, "d": 4}}
]
输出:
[
  ["a.b", "a.c", "a.d"],
  [1, 2, ""],
  [3, "", 4]
]

解释:
在这个例子中,对象是嵌套的。键表示每个值的完整路径,路径之间用句点分隔。 
有三个路径:"a.b"、"a.c"、"a.d"。

示例 4:

输入:
arr = [
  [{"a": null}],
  [{"b": true}],
  [{"c": "x"}]
]
输出: 
[
  ["0.a", "0.b", "0.c"],
  [null, "", ""],
  ["", true, ""],
  ["", "", "x"]
]

解释:
数组也被视为具有索引为键的对象。 
每个数组只有一个元素,所以键是"0.a"、"0.b"和"0.c"。

示例 5:

输入:
arr = [
  {},
  {},
  {},
]
输出:
[
  [],
  [],
  [],
  []
]

解释:
没有键,所以每一行都是一个空数组。

 

提示:

  • arr 是一个有效的 JSON 数组
  • 1 <= arr.length <= 1000
  • unique keys <= 1000

解法

方法一

function jsonToMatrix(arr: any[]): (string | number | boolean | null)[] {
  const dfs = (key: string, obj: any) => {
    if (
      typeof obj === 'number' ||
      typeof obj === 'string' ||
      typeof obj === 'boolean' ||
      obj === null
    ) {
      return { [key]: obj };
    }
    const res: any[] = [];
    for (const [k, v] of Object.entries(obj)) {
      const newKey = key ? `${key}.${k}` : `${k}`;
      res.push(dfs(newKey, v));
    }
    return res.flat();
  };

  const kv = arr.map(obj => dfs('', obj));
  const keys = [
    ...new Set(
      kv
        .flat()
        .map(obj => Object.keys(obj))
        .flat(),
    ),
  ].sort();
  const ans: any[] = [keys];
  for (const row of kv) {
    const newRow: any[] = [];
    for (const key of keys) {
      const v = row.find(r => r.hasOwnProperty(key))?.[key];
      newRow.push(v === undefined ? '' : v);
    }
    ans.push(newRow);
  }
  return ans;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文