如何在不指定query和metrics内部键的情况下扁平化自定义JS数据集?
扁平化嵌套JS数据集(无硬编码内部键)
给定如下JS数据集:
{ name: "demo", trials: 25, data: [ { query: {planner: "RRT", request: "jc", robot: "ur5"}, metrics: {time: [3,4], length: [32, 33]} }, { query: {planner: "EST", request: "oc"}, metrics: {time: [6, 8, 9], clearance: [0.7, 0.8, 0.9], success: [1, 0, 1]} } ] }
需要在不指定query和metrics对象内部键的前提下,将其扁平化为如下格式:
[ {name: "demo", trials: 25, planner: "RRT", robot: "ur5", request: "jc", time: 3, length: 32}, {name: "demo", trials: 25, planner: "RRT", robot: "ur5", request: "jc", time: 4, length: 33}, {name: "demo", trials: 25, planner: "EST", request: "oc", time: 6, clearance: 0.7, success: 1}, {name: "demo", trials: 25, planner: "EST", request: "oc", time: 8, clearance: 0.8, success: 0}, {name: "demo", trials: 25, planner: "EST", request: "oc", time: 9, clearance: 0.9, success: 1} ]
要求优先采用一行实现方案,代码将集成到Observable Notebooks中。补充说明:metrics对象始终为{ attribute: number[] }格式,同一metrics对象内的数组长度一致。
一行实现方案
const flattenData = obj => obj.data.flatMap(d => Object.values(d.metrics)[0]?.map((_, i) => ({...obj, ...d.query, ...Object.fromEntries(Object.entries(d.metrics).map(([k, arr]) => [k, arr[i]]))})) || []);
代码说明
- 遍历展开data项:用
flatMap处理data数组的每个元素,同时直接展开最终生成的结果数组 - 确定循环基准长度:通过
Object.values(d.metrics)[0]获取metrics中的第一个数组,以它的长度作为循环次数的基准(符合“同一metrics内数组长度一致”的前提) - 构建单条扁平对象:
- 展开原对象的顶层属性(
name、trials) - 展开当前data项的
query所有键值对 - 遍历
metrics的键值对,对每个键取对应数组的第i个元素,用Object.fromEntries转换为键值对对象后展开
- 展开原对象的顶层属性(
- 空值兼容:如果
metrics为空,返回空数组避免报错
示例调用
const input = { name: "demo", trials: 25, data: [ { query: {planner: "RRT", request: "jc", robot: "ur5"}, metrics: {time: [3,4], length: [32, 33]} }, { query: {planner: "EST", request: "oc"}, metrics: {time: [6, 8, 9], clearance: [0.7, 0.8, 0.9], success: [1, 0, 1]} } ] }; console.log(flattenData(input));
输出结果完全符合需求,可直接在Observable Notebooks中使用。
内容的提问来源于stack exchange,提问作者Captain Yoshi
相关产品推荐
相关产品推荐

