2

I have a list of courses in below json. I have tried to get the desired output to make the array as I want but I am getting the isssues in making the new array.

I am trying to get it using the below snippet but it is showing error for using [courses[i].client_id] with the result.

let courses = [
 {course_id: 1, name: "Test1", description: "Test1 desc", video_url: "111", client_id: 1},
 {course_id: 3, name: "A new course", description: "This is a temporary description used to test functionality. ", video_url: "https://vimeo.com/", client_id: 1},
 {course_id: 5, name: "Teaching", description: "programming language", video_url: "https://vimeo.com", client_id: 1},
 {course_id: 13, name: "Course285", description: "desc285", video_url: "", client_id: 2},
 {course_id: 16, name: "The NEW", description: "The Course is an training", video_url: "https://vimeo.com/", client_id: 1}
]
let result = [];
for (let i = 0; i < courses.length; i++) {
 if (courses && courses.length) {
 result[i][courses[i].client_id] = {
 clientId: courses[i].client_id
 } ;
 }
}

Expected Output

[
 {client_id: 1, courses:[{
 course_id:1,
 course_name: Test1,
 course_desc: description
 },{
 course_id:2,
 course_name: Test1,
 course_desc: description
 }]},
 {client_id:2,courses[{
 ....
 }]}
]
Yousaf
29.6k6 gold badges54 silver badges78 bronze badges
asked Jul 21, 2020 at 9:44
4
  • what is the result[i]? You not declared this array. Commented Jul 21, 2020 at 9:49
  • @Nick I forgot during adding the question but in code I declare it as let result = []; before for loop Commented Jul 21, 2020 at 9:54
  • 1
    Your definition of courses is neither valid JSON nor JavaScript. Consider posting an actual working example. Commented Jul 21, 2020 at 9:58
  • @GirkovArpa a comma is added after first object. Now it is valid. I am sorry I just copy it from browser console and tries to add it. Commented Jul 21, 2020 at 10:07

5 Answers 5

2

My case with reduce:

const userCourses = courses.reduce((acc, rec) => {
 const user = acc.find(a=>a.client_id === rec.client_id)
 if (user) {
 user.courses = [...user.courses, {course_id:rec.course_id, course_name: rec.name, course_desc: rec.description}]
 return [...acc]
 }
 return [...acc, { client_id: rec.client_id, courses: [{course_id: rec.course_id, course_name: rec.name, course_desc: rec.description}] }]
}, [])

See in the playground: https://jscomplete.com/playground/s538993

answered Jul 21, 2020 at 10:14
Sign up to request clarification or add additional context in comments.

Comments

2

My take on this:

courses
 .map(course => course.client_id)
 .filter((val, idx, arr) => arr.indexOf(val) === idx)
 .map(clientId => ({
 client_id: clientId,
 courses: courses
 .filter(course => course.client_id === clientId)
 .map(course => ({
 course_id: course.course_id,
 course_name: course.name,
 course_desc: course.description
 }))
 }))
answered Jul 21, 2020 at 10:20

2 Comments

Good first answer!
@GirkovArpa thnx :)
1

let courses = [{
 course_id: 1,
 name: "Test1",
 description: "Test1 desc",
 video_url: "111",
 client_id: 1
 },
 {
 course_id: 3,
 name: "A new course",
 description: "This is a temporary description used to test functionality. ",
 video_url: "https://vimeo.com/",
 client_id: 1
 },
 {
 course_id: 5,
 name: "Teaching",
 description: "programming language",
 video_url: "https://vimeo.com",
 client_id: 1
 },
 {
 course_id: 13,
 name: "Course285",
 description: "desc285",
 video_url: "",
 client_id: 2
 },
 {
 course_id: 16,
 name: "The NEW",
 description: "The Course is an training",
 video_url: "https://vimeo.com/",
 client_id: 1
 }
]
let result = {}
courses.map(course => {
 let newCourse = {
 course_id: course.course_id,
 course_name: course.name,
 course_desc: course.description
 }
 result[course.client_id] ?
 result[course.client_id].courses.push(newCourse) :
 result[course.client_id] = {
 client_id: course.client_id,
 courses: [newCourse]
 }
})
let output = Object.values(result)
console.log(output)

answered Jul 21, 2020 at 10:14

Comments

0

const courses = [
 { course_id: 1, name: 'Test1', description: 'Test1 desc', video_url: '111', client_id: 1 },
 { course_id: 3, name: 'A new course', description: 'This is a temporary description used to test functionality. ', video_url: 'https://vimeo.com/', client_id: 1 },
 { course_id: 5, name: 'Teaching', description: 'programming language', video_url: 'https://vimeo.com', client_id: 1 },
 { course_id: 13, name: 'Course285', description: 'desc285', video_url: '', client_id: 2 },
 { course_id: 16, name: 'The NEW', description: 'The Course is an training', video_url: 'https://vimeo.com/', client_id: 1 }
]
const output = courses.reduce((output, course) => {
 const { client_id, course_id, name, description } = course;
 const client = () => output.find(client => client.client_id == client_id);
 (client() || output.push({ client_id, courses: [] }) && client())
 .courses.push({ course_id, course_name: name, course_desc: description });
 return output;
}, []);
console.log(output);

answered Jul 21, 2020 at 10:07

Comments

0
let courses = [
 {
 course_id: 1, 
 name: "Test1", 
 description: "Test1 desc",
 video_url: "111", 
 client_id: 1
 },
 {
 course_id: 3, 
 name: "A new course", 
 description: "This is a temporary description used to test functionality. ", 
 video_url: "https://vimeo.com/", 
 client_id: 1
 },
 {
 course_id: 5, 
 name: "Teaching", 
 description: "programming language", 
 video_url: "https://vimeo.com", 
 client_id: 1
 },
 {
 course_id: 13, 
 name: "Course285", 
 description: "desc285", 
 video_url: "", 
 client_id: 2
 },
 {
 course_id: 16, 
 name: "The NEW", 
 description: "The Course is an training", 
 video_url: "https://vimeo.com/", 
 client_id: 1
 }
]
const arr = courses.reduce((acc, obj) => {
 const accObj = acc.find(e => e.client_id == obj.client_id);
 const courseObj = {
 course_id: obj.course_id, 
 course_name: obj.name, 
 course_desc: obj.description
 };
 if (accObj) {
 accObj.courses = [...accObj.courses, courseObj];
 return acc
 }
 return [...acc, { client_id: obj.client_id, courses: [courseObj] }];
}, []);
console.log(arr);
answered Jul 21, 2020 at 11:03

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.