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
vikas dhiman
2743 silver badges21 bronze badges
5 Answers 5
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
Denis Stukalov
1,2521 gold badge9 silver badges11 bronze badges
Sign up to request clarification or add additional context in comments.
Comments
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
}))
}))
2 Comments
GirkovArpa
Good first answer!
reded
@GirkovArpa thnx :)
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
kapil pandey
1,9231 gold badge16 silver badges26 bronze badges
Comments
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
GirkovArpa
5,1015 gold badges19 silver badges52 bronze badges
Comments
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
oleksiisedun
5293 silver badges15 bronze badges
Comments
lang-js
coursesis neither valid JSON nor JavaScript. Consider posting an actual working example.