如何在JavaScript中将数组合并为一个数组?

3
我有一个 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 mappers 或其他类似的函数来完成?

已经有一些解决方案从这个阶段,我得到了(作为这里的解决方案),但我想找到一个特定于我的“包含类型为数组的属性的数组或对象”的问题的解决方案。


2
你说你想避免循环,但是你认为lodash是如何从数组中获取数据的呢?仅仅因为你不写循环并不意味着你的代码不会执行它们。 - takendarkk
你可以直接将结果展平并过滤掉重复项。这两个操作都很容易在这里找到。 - mhodges
你可能还可以考虑使用集合(Set)来处理重复项,而不是使用数组。 - pinkwaffles
1个回答

9

使用 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)

使用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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接