0

I have a array

const List = [
{id:1, name:"jack", grade:'98'},
{id:2, name:"jack", grade:'96'}
{id:3, name:"jack", grade:'80'}
{id:4, name:"jack", grade:'76'}
{id:5, name:"jack", grade:'78'}
{id:6, name:"marry", grade:'90'},
{id:7, name:"marry", grade:'91'},
{id:8, name:"marry", grade:'96'},
{id:9, name:"marry", grade:'95'},
{id:10, name:"marry", grade:'82'},
{id:11, name:"paul", grade:'87'},
{id:12, name:"paul", grade:'98'},
{id:13, name:"paul", grade:'95'},
{id:14, name:"paul", grade:'93'},
{id:15, name:"paul", grade:'75'},
]

so I want to design a drop down on react, with name in the left and a drop down component in the right with grade, I am stuck in when name is jack how in the dropdown only display grade for jack in the dropdown but not someone else's grade. so which basically when name is jack, I need to create a new array like [98,96,80,76,78], and when name is marry, grade array is [90,91,96,95,82], and how to find a way to iterate through each name, I try to use .map() but not sure of it.

5 Answers 5

3

you can use filter to get the list of object and use map to get the grade like this

const List = [
{id:1, name:"jack", grade:'98'},
{id:2, name:"jack", grade:'96'},
{id:3, name:"jack", grade:'80'},
{id:4, name:"jack", grade:'76'},
{id:5, name:"jack", grade:'78'},
{id:6, name:"marry", grade:'90'},
{id:7, name:"marry", grade:'91'},
{id:8, name:"marry", grade:'96'},
{id:9, name:"marry", grade:'95'},
{id:10, name:"marry", grade:'82'},
{id:11, name:"paul", grade:'87'},
{id:12, name:"paul", grade:'98'},
{id:13, name:"paul", grade:'95'},
{id:14, name:"paul", grade:'93'},
{id:15, name:"paul", grade:'75'},
];

const getGrade = name => List.filter(val => val.name === name).map(info => info.grade);

console.log('jack',getGrade('jack'));
console.log('paul',getGrade('paul'));

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

1 Comment

A filter followed by a map should be done in a single reduce so you don't iterate the collection twice List.reduce((results, val) => { if (val.name === name) { results.push(info.grade); } return results; }, []);
1

const List = [
{id:1, name:"jack", grade:'98'},
{id:2, name:"jack", grade:'96'},
{id:3, name:"jack", grade:'80'},
{id:4, name:"jack", grade:'76'},
{id:5, name:"jack", grade:'78'},
{id:6, name:"marry", grade:'90'},
{id:7, name:"marry", grade:'91'},
{id:8, name:"marry", grade:'96'},
{id:9, name:"marry", grade:'95'},
{id:10, name:"marry", grade:'82'},
{id:11, name:"paul", grade:'87'},
{id:12, name:"paul", grade:'98'},
{id:13, name:"paul", grade:'95'},
{id:14, name:"paul", grade:'93'},
{id:15, name:"paul", grade:'75'},
]
const names = {};
List.map(a => {
    if(!names[a.name]) {
        names[a.name] = [];
    }
    names[a.name].push(a.grade);
})
console.log(names);

Comments

0

I took it you wanted to reduce the array, not just get the grades for a person. If so:

const List = [
{id:1, name:"jack", grade:'98'},
{id:2, name:"jack", grade:'96'},
{id:3, name:"jack", grade:'80'},
{id:4, name:"jack", grade:'76'},
{id:5, name:"jack", grade:'78'},
{id:6, name:"marry", grade:'90'},
{id:7, name:"marry", grade:'91'},
{id:8, name:"marry", grade:'96'},
{id:9, name:"marry", grade:'95'},
{id:10, name:"marry", grade:'82'},
{id:11, name:"paul", grade:'87'},
{id:12, name:"paul", grade:'98'},
{id:13, name:"paul", grade:'95'},
{id:14, name:"paul", grade:'93'},
{id:15, name:"paul", grade:'75'},
];
const reduced = List.reduce((accum, x) => {
  const f = accum.find(y => y.name === x.name);
  if (f) f.grade.push(x.grade);
  else {
    accum.push({
      name: x.name,
      grade: [x.grade],
    });
  }
  return accum;
}, []);


console.log(reduced);
// [ { name: 'jack', grade: [ '98', '96', '80', '76', '78' ] },
// { name: 'marry', grade: [ '90', '91', '96', '95', '82' ] },
// { name: 'paul', grade: [ '87', '98', '95', '93', '75' ] } ]

Comments

0

Build one object with keys as name and values as aggregated grade using forEach loop. This way in one iteration, you can gather the data you need.

const List = [
{id:1, name:"jack", grade:'98'},
{id:2, name:"jack", grade:'96'},
{id:3, name:"jack", grade:'80'},
{id:4, name:"jack", grade:'76'},
{id:5, name:"jack", grade:'78'},
{id:6, name:"marry", grade:'90'},
{id:7, name:"marry", grade:'91'},
{id:8, name:"marry", grade:'96'},
{id:9, name:"marry", grade:'95'},
{id:10, name:"marry", grade:'82'},
{id:11, name:"paul", grade:'87'},
{id:12, name:"paul", grade:'98'},
{id:13, name:"paul", grade:'95'},
{id:14, name:"paul", grade:'93'},
{id:15, name:"paul", grade:'75'},
]

const all = {};
List.forEach(
  ({ name, grade }) => (all[name] = (all[name] ?? []).concat([grade]))
);

console.log(all["jack"]);
console.log(all["paul"]);

Comments

0

You can first create an array and store all students' names there and then using map function, create an array of objects which will give you the desired output.

let list = [
{id:1, name:"jack", grade:'98'},
{id:2, name:"jack", grade:'96'},
{id:3, name:"jack", grade:'80'},
{id:4, name:"jack", grade:'76'},
{id:5, name:"jack", grade:'78'},
{id:6, name:"marry", grade:'90'},
{id:7, name:"marry", grade:'91'},
{id:8, name:"marry", grade:'96'},
{id:9, name:"marry", grade:'95'},
{id:10, name:"marry", grade:'82'},
{id:11, name:"paul", grade:'87'},
{id:12, name:"paul", grade:'98'},
{id:13, name:"paul", grade:'95'},
{id:14, name:"paul", grade:'93'},
{id:15, name:"paul", grade:'75'},
]

let students = [];
let grades = [];
for(let row of list) {
    if(!students.includes(row.name)) students.push(row.name);
}
console.log(students);
students.map(stud => {
    let arr = [], obj={};
    list.map(li => {        
        if(li.name === stud) arr.push(li.grade);
    })
    obj.name = stud;
    obj.grades = arr;
    grades.push(obj);
})
console.log(grades);

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.