我在JavaScript中有一个对象数组。每个对象都包含名为“ myPropArray”的属性,该属性实际上是另一个数组。这是此数组的结构:
let myBaseArray = [
{
myPropArray: ["s1", "s2"],
someOtherProp: "randomString1"
},
{
myPropArray: ["s2", "s3"],
someOtherProp: "randomString2"
}
]
我需要的是获取此属性下的所有数组,并将它们全部合并到一个数组中,而无需重复(在JavaScript中)。 这是我的实现(使用lodash):
_.map(myBaseArray , 'myPropArray')
实际上返回了以下结果:
[
["s1", "s2"],
["s2", "s3"]
]
但是我要完成的是:
["s1", "s2", "s3"]
(如果可能)我也在尝试避免for-each循环,因为这需要我进行尽可能的优化,我想知道是否可以使用lodash映射器或其他类似函数来完成?
从这个阶段开始,我已经有了一些解决方法(as the solution here),但是我想找到一个解决方案,这个问题将专门针对我的“包含数组类型属性的数组或对象”
答案 0 :(得分:2)
使用Array.map()
提取属性的值,将spreading展平为Array.concat()
,然后使用Set获得唯一的值。将Set传播回数组:
const myBaseArray = [
{
myPropArray: ["s1", "s2"],
someOtherProp: "randomString1"
},
{
myPropArray: ["s2", "s3"],
someOtherProp: "randomString2"
}
]
const result = [...new Set([].concat(...myBaseArray.map((o) => o.myPropArray)))]
console.log(result)
lodash的方式是使用_.flatMap()
和_.uniq()
:
const myBaseArray = [
{
myPropArray: ["s1", "s2"],
someOtherProp: "randomString1"
},
{
myPropArray: ["s2", "s3"],
someOtherProp: "randomString2"
}
]
const result = _.uniq(_.flatMap(myBaseArray, 'myPropArray'))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>