将嵌套对象中的单值数组转换为单值javascript
Posted
技术标签:
【中文标题】将嵌套对象中的单值数组转换为单值javascript【英文标题】:convert single value array within a nested object to a single value javascript 【发布时间】:2021-11-15 02:38:52 【问题描述】:我有一个嵌套对象,我想将单个值 group
的数组转换为单个值:
real_data = [
[
x: 1, group: [1],
x: 9, group: [2],
x: 3, group: [3]
],
[
x: 2, group: [1],
x: 4, group: [2],
x: 10, group: [3]
],
[
x: 1, group: [1],
x: 5, group: [2],
x: 12, group: [3]
],
[],
[
x: 1, group: [1],
x: 5, group: [2],
x: 12, group: [3]
]
]
我在这里尝试过使用 map,但由于数组的嵌套性质而一直在苦苦挣扎。我也尝试过一些嵌套的 for 循环并与之斗争。所需的输出是:
desired_output = [
[
x: 1, group: 1,
x: 9, group: 2,
x: 3, group: 3
],
[
x: 2, group: 1,
x: 4, group: 2,
x: 10, group: 3
],
[
x: 1, group: 1,
x: 5, group: 2,
x: 12, group: 3
],
[],
[
x: 1, group: 1,
x: 5, group: 2,
x: 12, group: 3
]
]
任何帮助表示赞赏!
【问题讨论】:
如原帖中所述,我尝试使用map
和嵌套的 for 循环,但由于它们不成功,我在发布不起作用的代码时没有看到任何价值。我会继续努力,如果我再进一步,我会添加一些伪代码!
您应该展示(研究)努力以自己解决问题。 “请给我一个可行的解决方案” 是不够的。我们很乐意帮助修复损坏的代码,但 SO 不是免费的代码编写服务 -> How do I ask a good question? / How much research effort is expected of Stack Overflow users?
【参考方案1】:
根据所需的输出,您可以使用以下内容
real_data.map(o=>
return o.map(p=>
return ...p, group:parseInt(p.group.toString(),10)
)
)
【讨论】:
为什么是.toString()
和parseInt()
? o.O
@MayaGans 请使用version from Ahmer。将数组转换为字符串,然后将其解析为数字过于复杂且容易出错。
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:
很简单。
-
循环完整的外部数组
循环内部数组
设置内部数组
group
的值
real_data = [
[
x: 1, group: [1],
x: 9, group: [2],
x: 3, group: [3]
],
[
x: 2, group: [1],
x: 4, group: [2],
x: 10, group: [3]
],
[
x: 1, group: [1],
x: 5, group: [2],
x: 12, group: [3]
],
[],
[
x: 1, group: [1],
x: 5, group: [2],
x: 12, group: [3]
]
];
var desiredOutput = real_data.map( elements =>
let newElements = elements.map(element =>
element.group = element.group[0];
return element;
);
return newElements;
)
【讨论】:
请注意,这将修改原始输入,这可能是也可能不是 OP 最初的意图。 (仅供参考)【参考方案3】:不用修改原来的输入就可以达到想要的结果-
const input =
[[x:1,group:[1],x:9,group:[2],x:3,group:[3]],[x:2,group:[1],x:4,group:[2],x:10,group:[3]],[x:1,group:[1],x:5,group:[2],x:12,group:[3]],[],[x:1,group:[1],x:5,group:[2],x:12,group:[3]]]
const output =
input.map(x => x.map(( group: [group], ...y ) => ( ...y, group )))
console.log(output)
[
[
x:1,group:1,
x:9,group:2,
x:3,group:3
],
[
x:2,group:1,
x:4,group:2,
x:10,group:3
],
[
x:1,group:1,
x:5,group:2,
x:12,group:3
],
[],
[
x:1,group:1,
x:5,group:2,
x:12,group:3
]
]
【讨论】:
你如何看待这种情况下的逗号操作符?为了避免额外的传播,例如input.map(x => x.map(( group: [g], ...y ) => (y.group = g, y)))
这是一个玩具问题,所以没有正确/错误的解决方案。我看到的唯一“问题”是y.group = g
是必要的并且会改变y
。 y
在这种情况下是“新鲜的”,因此原始输入没有发生突变,但乍一看它看起来像一个突变,这通常足以让我找到避免它的方法。如果输入数据脏或变形,解构也有点不可靠。更卫生的方法可能是input.map(x => x.map(y => Object.assign(, y, group: y?.group?.[0])))
,它允许group
不存在和/或非数组。以上是关于将嵌套对象中的单值数组转换为单值javascript的主要内容,如果未能解决你的问题,请参考以下文章
无法在具有聚合值的 HAVING 子句中使用来自子查询表连接的单值列