Jonas Lu
Jonas Lu

Reputation: 181

javascript reduce to desire array

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

Answers (5)

Rushabh Shah
Rushabh Shah

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

Siva Kondapi Venkata
Siva Kondapi Venkata

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

vnxyz
vnxyz

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

see sharper
see sharper

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

Raj Kumar
Raj Kumar

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

Related Questions