简体   繁体   English

javascript 减少到期望数组

[英]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.所以基本上当名字是杰克时,我需要创建一个像[98,96,80,76,78]这样的新数组,当名字是结婚时,等级数组是[90,91,96,95,82] ,并且如何找到遍历每个名称的方法,我尝试使用.map()但不确定。

you can use filter to get the list of object and use map to get the grade like this您可以使用过滤器获取 object 的列表并使用 map 来获取这样的等级

 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'));

 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);

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' ] } ]

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.您可以首先创建一个数组并在其中存储所有学生的姓名,然后使用 map function 创建一个对象数组,该数组将为您提供所需的 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);

Build one object with keys as name and values as aggregated grade using forEach loop.使用forEach循环构建一个 object,其中键作为名称,值作为聚合等级。 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"]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM