将嵌套对象中的单值数组转换为单值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 是必要的并且会改变yy 在这种情况下是“新鲜的”,因此原始输入没有发生突变,但乍一看它看起来像一个突变,这通常足以让我找到避免它的方法。如果输入数据脏或变形,解构也有点不可靠。更卫生的方法可能是input.map(x => x.map(y => Object.assign(, y, group: y?.group?.[0]))),它允许group 不存在和/或非数组。

以上是关于将嵌套对象中的单值数组转换为单值javascript的主要内容,如果未能解决你的问题,请参考以下文章

数据的单值多值派生简单复合属性

Java 基础知识总结 3

无法在具有聚合值的 HAVING 子句中使用来自子查询表连接的单值列

使用 pyspark 将 StructType、ArrayType 转换/转换为 StringType(单值)

单值Mysqli [重复]

单值Mysqli [重复]