1

Say I have a object that looks like this...

values = {
      'student': [{
                     'field': 'prefix', 
                     'description': 'First name'
                  }, 
                  {
                     'field': 'suffix', 
                     'description': 'Last name'
                  }, 
                  {
                     'field': 'student_email',
                     'description': 'Email address'
                  }],
      'classes':  [{
                     'field': 'course_code', 
                     'description': 'Course code'
                  }]

    }

I'm trying to get

['prefix', 'suffix', 'student_email', 'course_code']

So this is what I have:

for (const v in values) {
  v.map((obj, idx) => {
    console.log(obj);
  });
}

And it just returns v.map is not a function. How can I make this work, what am I doing wrong? (written in jsx).

2 Answers 2

2

You're close:

for(const v in values) {
  values[v].map(obj => {
    console.log(obj.field);
    return obj.field;
  });
}

values = {
  'student': [{
    'field': 'prefix',
    'description': 'First name'
  }, {
    'field': 'suffix',
    'description': 'Last name'
  }, {
    'field': 'student_email',
    'description': 'Email address'
  }],
  'classes': [{
    'field': 'course_code',
    'description': 'Course code'
  }]
};

for(const v in values) {
  values[v].map(obj => {
    console.log(obj.field);
    return obj.field;
  });
}

To put them in an array, you could do something like this:

var result = [];

for(const v in values) {
  result = result.concat(values[v].map(obj => {
    return obj.field;
  }));
}

var values = {
  'student': [{
    'field': 'prefix',
    'description': 'First name'
  }, {
    'field': 'suffix',
    'description': 'Last name'
  }, {
    'field': 'student_email',
    'description': 'Email address'
  }],
  'classes': [{
    'field': 'course_code',
    'description': 'Course code'
  }]
};

var result = [];

for(const v in values) {
  result = result.concat(values[v].map(obj => {
    return obj.field;
  }));
}

console.log(result);

Sign up to request clarification or add additional context in comments.

Comments

1

The variable values is an object, map() relies on it being an array, as the function is defined on Array.prototype.

Change your variable to this:

values = [
  {
    'student': [{
                 'field': 'prefix', 
                 'description': 'First name'
              }, 
              {
                 'field': 'suffix', 
                 'description': 'Last name'
              }, 
              {
                 'field': 'student_email',
                 'description': 'Email address'
              }]
  },
  {
    'classes':  [{
                 'field': 'course_code', 
                 'description': 'Course code'
              }]
  }
]

Then you can use map on the values array, retrieving what info you need, for example, something like the following should let you map each value and each subvalue:

for (const value in values) {
  value.map((obj) => {
    // should get two calls to the below, one for 'student' and one for 'classes'
    obj.value.map((info) => {
      // should result in 4 calls to log, printing all 'description' values
      console.log(info['description']); 
    }
  });
}

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.