Skip to content

Latest commit

 

History

History

2675.Array of Objects to Matrix

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

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 = [
  {},
  {},
  {},
]
输出:
[
  [],
  [],
  [],
  []
]

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

 

提示:

  • 1 <= arr.length <= 1000
  • unique keys <= 1000

解法

TypeScript

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;
}