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[{
        ....
    }]}
]
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

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

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)

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

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

Comments

Your Answer

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.