【问题标题】:How to map through array merge getting the same for each result [lodash]如何通过数组合并映射每个结果都相同[lodash]
【发布时间】:2019-02-07 17:55:41
【问题描述】:

我正在尝试将课程与用户进度数据合并。我相信我有一个指针问题。

我已经成功完成了两个数组的内部合并。问题在于循环访问用户并且没有获得正确的课程数据以及附加的进度数据。

课程资料

   let lessons = [
     {“id”: “0106c568-70c0-4e56-8139-8e7f7d124f95",},
     {“id”: “033e18a2-d470-4fd7-8bdc-53e610f3f784",},
     {“id”: “d60f751c-d7d2-4dc6-9eda-a03bc5ebddc6",},
   ];

所有用户的进度

const usersProgresses = [
     [
       {
         “id”: “cjrtmj9d601b908559oxe8hwk”,
         “lesson”: “0106c568-70c0-4e56-8139-8e7f7d124f95",
         “score”: null,
       },
       {
         “id”: “cjrtmk2hv01bx0855yof2ehj4”,
         “lesson”: “033e18a2-d470-4fd7-8bdc-53e610f3f784”,
         “score”: 100,
       },
       {
         “id”: “cjrtmlohd01cp0855jnzladye”,
         “lesson”: “3724d7df-311c-46d9-934f-a9c44d9335ae”,
         “score”: 20,
       }
     ],
     ...
   ];

遍历用户并在课程中合并进度

   // for each user
   const result = usersProgresses.map(user => {
     // merge progress and lesson data by lesson.id
     const mergedProgress = [...lessons].map(lesson => {
       return _.merge(lesson,_ .find(userProgress, { lesson: lesson.id }));
     });
     return mergedProgress;
   });

result 中的预期数据:

   [
     [
       {
         “id”: “0106c568-70c0-4e56-8139-8e7f7d124f95”,
         “lesson”: “0106c568-70c0-4e56-8139-8e7f7d124f95”,
         “score”: null,
       },
       {
         “id”: “033e18a2-d470-4fd7-8bdc-53e610f3f784",
         “lesson”: “033e18a2-d470-4fd7-8bdc-53e610f3f784",
         “score”: 100,
       },
       {
         “id”: “d60f751c-d7d2-4dc6-9eda-a03bc5ebddc6”,
       }
     ]
   ]

但得到:

   [
     [
       {
         “id”: “0106c568-70c0-4e56-8139-8e7f7d124f95”,
       },
       {
         “id”: “033e18a2-d470-4fd7-8bdc-53e610f3f784”,
       },
       {
         “id”: “d60f751c-d7d2-4dc6-9eda-a03bc5ebddc6”,
       }
     ]
   ]

【问题讨论】:

标签: javascript arrays lodash


【解决方案1】:

你可以在 vanilla js 中使用嵌套的.map 来做这样的事情:

const lessons = [{"id":"0106c568-70c0-4e56-8139-8e7f7d124f95",},{"id":"033e18a2-d470-4fd7-8bdc-53e610f3f784",},{"id":"d60f751c-d7d2-4dc6-9eda-a03bc5ebddc6",}]

const usersProgress = [[{"id":"cjrtmj9d601b908559oxe8hwk","lesson":"0106c568-70c0-4e56-8139-8e7f7d124f95","score":null,},{"id":"cjrtmk2hv01bx0855yof2ehj4","lesson":"033e18a2-d470-4fd7-8bdc-53e610f3f784","score":100,},{"id":"cjrtmlohd01cp0855jnzladye","lesson":"3724d7df-311c-46d9-934f-a9c44d9335ae","score":20,}]]

const output = usersProgress.map(user => lessons.map(lesson =>
    ({...user.find(p => p.lesson == lesson.id), ...lesson }))
 );
  
console.log(output)

【讨论】:

  • 没注意到。更改后,我的解决方案将与您的解决方案相同,因此已删除。 +1
【解决方案2】:

您可以使用 _.keyBy() 按课程 ID 创建用户课程字典。创建结果对象时,使用括号表示法通过 id 获取课程,并将其传播(undefined 值将被忽略)。

const lessons = [{"id":"0106c568-70c0-4e56-8139-8e7f7d124f95",},{"id":"033e18a2-d470-4fd7-8bdc-53e610f3f784",},{"id":"d60f751c-d7d2-4dc6-9eda-a03bc5ebddc6",}]

const usersProgress = [[{"id":"cjrtmj9d601b908559oxe8hwk","lesson":"0106c568-70c0-4e56-8139-8e7f7d124f95","score":null,},{"id":"cjrtmk2hv01bx0855yof2ehj4","lesson":"033e18a2-d470-4fd7-8bdc-53e610f3f784","score":100,},{"id":"cjrtmlohd01cp0855jnzladye","lesson":"3724d7df-311c-46d9-934f-a9c44d9335ae","score":20,}]]

const result = usersProgress.map(user => {
  const lessonsById = _.keyBy(user, 'lesson') // create a dictionary of lesson by id

  return lessons.map(({ id }) => ({
    ...lessonsById[id], // get the lesson or undefined if not found, and spread
    id
  }))
});
   
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

【讨论】:

    【解决方案3】:

            const usersProgresses = [
                [
                {
                    "id": "cjrtmj9d601b908559oxe8hwk",
                    "lesson": "0106c568-70c0-4e56-8139-8e7f7d124f95",
                    "score": null,
                },
                {
                    "id": "cjrtmk2hv01bx0855yof2ehj4",
                    "lesson": "033e18a2-d470-4fd7-8bdc-53e610f3f784",
                    "score": 100,
                },
                {
                    "id": "cjrtmlohd01cp0855jnzladye",
                    "lesson": "3724d7df-311c-46d9-934f-a9c44d9335ae",
                    "score": 20,
                }
                ],
            ];
    
            let lessons = [
                {"id": "0106c568-70c0-4e56-8139-8e7f7d124f95",},
                {"id": "033e18a2-d470-4fd7-8bdc-53e610f3f784",},
                {"id": "d60f751c-d7d2-4dc6-9eda-a03bc5ebddc6",},
            ];
    
    
            const mergedProgress = usersProgresses.map((Progresses) => {
                return [...lessons].map(lesson => {
                    return Object.assign(lesson, Progresses.find((i) => i.lesson === lesson.id));
                });
            })
    
            console.log(mergedProgress)
        
    
    
    
      

    【讨论】:

    • 请使用console.log(JSON.stringify(mergedProgress)) 并将您的结果显示为文本而不是图像。这使人们更容易获得答案。
    猜你喜欢
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2021-07-19
    • 2023-02-05
    • 1970-01-01
    • 2020-09-12
    • 2021-12-04
    相关资源
    最近更新 更多