[英]Better way of doing array Flat
So I a trying to take out the objects from within an array to a new array.所以我试图将数组中的对象取出到一个新数组中。 But I need a more better and efficient way of doing this.但我需要一种更好、更有效的方法来做到这一点。
this is how I did it.我就是这样做的。 First I created a new array through filter1, then I flattened it and then I created another array with filter3.首先,我通过 filter1 创建了一个新数组,然后将其展平,然后使用 filter3 创建了另一个数组。
filter1 = myArray.map((a => a.courseEnrolled);
filter2 = filter1.flat(1);
filter3 = filter2.map((a => a.course);
I am looking for better way of achieving same result.我正在寻找更好的方法来实现相同的结果。
myArray = [
{
name: "john",
courseEnrolled: [
{
course: {
name: "react",
},
},
{
course: {
name: "java",
},
},
],
},
{
name: "Doe",
courseEnrolled: [
{
course: {
name: "java",
},
},
{
course: {
name: "angular",
},
},
],
},
];
expectedArray = [
{
name: "react",
},
{
name: "java",
},
{
name: "java",
},
{
name: "react",
},
];
uniqueExpectedArray = [
{
name: "react",
},
{
name: "java",
},
{
name: "react",
},
];
Use a flatMap()
with a nested map()
to get all the name
's使用带有嵌套map()
的flatMap()
) 来获取所有name
的
Then get all the unique values , and use map()
to convert to the final object然后获取所有唯一值,并使用map()
转换为最终的object
myArray = [{name: "john", courseEnrolled: [{course: {name: "react", }, }, {course: {name: "java", }, }, ], }, {name: "Doe", courseEnrolled: [{course: {name: "java", }, }, {course: {name: "angular", }, }, ], }, ]; const all = myArray.flatMap(e => e.courseEnrolled.map(c => c.course.name)); const res = all.filter((v, i, s) => s.indexOf(v) === i).map(name => ({ name })); console.log(res)
[
{
"name": "react"
},
{
"name": "java"
},
{
"name": "angular"
}
]
Use this:用这个:
expectedArray = myArray.map(a => a.courseEnrolled.map((c) => c.course)).flat(4)
uniqueArray = [...new Set(expectedArray.map(c => c.name))].map((c)=>{ return { "name" : c} })
I hope this answer helps you.我希望这个答案对你有所帮助。 Comment if you have any questions or doubts.如果您有任何问题或疑问,请发表评论。
Lodash, if you don't mind Lodash,如果你不介意的话
const myArray = [{name: "john",courseEnrolled: [{course: {name: "react"}},{course: {name: "java"}}]},{name: "Doe",courseEnrolled: [{course: {name: "java"}},{course: {name: "angular"}}]}]; const result = _(myArray).flatMap(({ courseEnrolled }) => courseEnrolled.map(({ course }) => course)).uniqBy('name'); console.log(result);
.as-console-wrapper { max-height: 100%;important: top: 0 }
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
Another solution.另一种解决方案。 Kind of one-liner一种单线
const myArray = [{name: "john",courseEnrolled: [{course: {name: "react"}},{course: {name: "java"}}]},{name: "Doe",courseEnrolled: [{course: {name: "java"}},{course: {name: "angular"}}]}]; const result = Object.values(myArray.reduce((acc, { courseEnrolled: arr }) => ( arr.forEach(({ course })=> (acc[course.name]??= course)), acc ), {})); console.log(result);
.as-console-wrapper { max-height: 100%;important: top: 0 }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.