简体   繁体   English

更好的方式做数组平面

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM