简体   繁体   中英

Create nested Object Array Javascript

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

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

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

 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)

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM