如何从对象数组中提取嵌套属性b的唯一键并转为一维数组?
如何从对象数组中提取嵌套对象的唯一键列表?
嘿,我来帮你搞定这个问题!你现在的情况是有一个包含嵌套对象的数组,想要提取所有b属性里的唯一键,但用map得到的是二维数组,对吧?
先再明确下你的输入和目标:
你的输入数组:
[ { "a":"alpha", "b":{ "x":true, "y":true } }, { "a":"beta", "b":{ "x":true, "z":true } } ]
期望输出:["x", "y", "z"]
你之前用的代码:
const mykeys = myArray.map(item => Object.keys(item.b))
得到的是[["x","y"], ["x","z"]],这是因为map会为数组每个元素返回一个新数组,所以最终是嵌套结构。下面给你两种简单的解决办法:
方法一:扁平化数组后去重(简洁直观)
我们可以先把嵌套数组“拍平”成一维,再利用Set的唯一性去重,最后转成普通数组:
const myArray = [ { "a":"alpha", "b":{ "x":true, "y":true } }, { "a":"beta", "b":{ "x":true, "z":true } } ]; const mykeys = [...new Set(myArray.map(item => Object.keys(item.b)).flat())]; console.log(mykeys); // 输出 ["x", "y", "z"]
拆解下步骤:
myArray.map(item => Object.keys(item.b)):和你之前的代码一样,得到二维数组[["x","y"], ["x","z"]].flat():把二维数组转换为一维数组["x","y","x","z"]new Set(...):创建Set对象自动过滤重复的x,得到Set {"x", "y", "z"}[...Set]:通过展开运算符把Set转回普通数组
方法二:用reduce一步处理(性能更优)
如果你的数组数据量比较大,上面的方法会先生成一个包含重复元素的一维数组,再去重,有点多余。用reduce可以在遍历过程中直接收集唯一键,效率更高:
const myArray = [ { "a":"alpha", "b":{ "x":true, "y":true } }, { "a":"beta", "b":{ "x":true, "z":true } } ]; const mykeys = [...myArray.reduce((acc, item) => { // 遍历当前item.b的所有键,添加到Set里 Object.keys(item.b).forEach(key => acc.add(key)); return acc; }, new Set())]; // 初始值是一个空Set,用来存唯一键 console.log(mykeys); // 输出 ["x", "y", "z"]
这个方法只需要遍历数组一次,同时利用Set自动去重的特性,避免了额外的数组扁平化操作,在大数据量下表现更好。
内容的提问来源于stack exchange,提问作者asanas
相关产品推荐
相关产品推荐

