javascriptarraysfilterarray-map

How to extract numbers from an array


So basically I have an array of ids and I want to return only a simple array which I want to look like this

*[1,2,3]*

instead of

*[0:[1] , 1:[2]]*

Is there any way to do it

Code

const usersWhoHavePurchasedYourCourses = usersWhoHaveTokens.filter(
(user1: any) => {
  return user1.tokens
    ?.map((token: any) => parseInt(token.course_id))
    .includes(user.courses?.map((course: any) => course.id));
});

The output looks like this

output

As I said I don`t want to return this kind of output.


Solution

  • Edit

    In attempting to reverse-engineer your logic, wouldn't you want to filter by checking if a user has at least one course? I recommend using Array.prototype.some as your filter result.

    const user = { courses: [{ id: 1 }, { id: 2 }] };
    
    const usersWhoHaveTokens = [
      { id: 1, tokens: [{ course_id: '1' }] },
      { id: 2, tokens: [{ course_id: '2' }] },
      { id: 3, tokens: [{ course_id: '3' }] },
    ];
    
    // Compute the set, for faster processing
    const userCourseIds = new Set(user.courses.map((course) => course.id));
    
    const usersWhoHavePurchasedYourCourses = usersWhoHaveTokens
      .filter(({ tokens }) => tokens
        .some((token) => userCourseIds.has(parseInt(token.course_id))))
      .map(({ id }) => id);
    
    console.log(usersWhoHavePurchasedYourCourses); // [1, 2]


    Original response

    If you object is an 'object' type, you will need to transform it into an array, and then flatten it.

    const
      obj = { 0: [1], 1: [2] },
      arr = Object.values(obj).flat();
    
    console.log(JSON.stringify(arr)); // [1, 2]

    If you want to preserve indices:

    const
      obj = { 1: [2], 5: [6] },
      arr = Object.entries(obj).reduce((acc, [index, value]) => {
        acc[+index] = value;
        return acc;
      }, []).map(([value]) => value);
    
    console.log(JSON.stringify(arr)); // [null, 2, null, null, null, 6]