Reputation: 181
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.
Upvotes: 0
Views: 62
Reputation: 76
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);
Upvotes: 0
Reputation: 11001
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"]);
Upvotes: 0
Reputation: 466
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);
Upvotes: 1
Reputation: 12025
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' ] } ]
Upvotes: 0
Reputation: 854
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'));
Upvotes: 3