Как отобразить слияние массива, получая то же самое для каждого результата [lodash] - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь объединить уроки с данными о прогрессе пользователя.Я полагаю, что у меня проблема с указателем.

Я успешно справился с внутренним слиянием двух массивов.Проблема заключается в том, что пользователи не могут получить правильные данные урока с прикрепленными данными о прогрессе.

данные урока

   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”,
       }
     ]
   ]

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

        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)
    



  
0 голосов
/ 08 февраля 2019

Вы можете использовать _.keyBy() для создания словаря пользовательских уроков по идентификатору урока.При создании объекта результата получите урок по идентификатору, используя обозначения в скобках, и распространите его (значения 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>
0 голосов
/ 07 февраля 2019

Вы можете сделать что-то подобное, используя вложенный .map в vanilla js:

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)
...