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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.