del*_*lux 3 javascript arrays concatenation lodash
我有一个 JavaScript 对象数组。每个对象都包含名为“myPropArray”的属性,它实际上是另一个数组。这是该数组的结构:
let myBaseArray = [
{
myPropArray: ["s1", "s2"],
someOtherProp: "randomString1"
},
{
myPropArray: ["s2", "s3"],
someOtherProp: "randomString2"
}
]
Run Code Online (Sandbox Code Playgroud)
我需要的是获取此属性下的所有数组并将它们全部合并到一个数组中,不重复(在 JavaScript 中)。这是我的实现(使用 lodash):
_.map(myBaseArray , 'myPropArray')
Run Code Online (Sandbox Code Playgroud)
实际上返回以下结果:
[
["s1", "s2"],
["s2", "s3"]
]
Run Code Online (Sandbox Code Playgroud)
但我想要完成的是:
["s1", "s2", "s3"]
Run Code Online (Sandbox Code Playgroud)
另外(如果可能的话)我试图避免 for-each 循环,因为这需要我尽可能地优化,我想知道是否可以使用 lodash 映射器或其他类似的函数来完成?
从这个阶段我已经得到了一些解决方案(作为此处的解决方案),但我想找到一个针对此问题的解决方案,该解决方案将特定于我的“包含数组类型属性的数组或对象”。
使用 提取属性的值Array.map()
,通过展开到 中进行展平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)
Run Code Online (Sandbox Code Playgroud)
lodash 方法是使用_.flatMap()
, 和_.uniq()
:
const myBaseArray = [
{
myPropArray: ["s1", "s2"],
someOtherProp: "randomString1"
},
{
myPropArray: ["s2", "s3"],
someOtherProp: "randomString2"
}
]
const result = _.uniq(_.flatMap(myBaseArray, 'myPropArray'))
console.log(result)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)