0
votes

Trouvez un élément unique dans un tableau et trouvez la somme de champ (dire des marques) pour les éléments dupliqués

Cette question peut être similaire à En Angular2 * Ngfor itération, comment produire uniquement des valeurs uniques de la matrice? mais ma question est d'avoir d'autres fonctionnalités.

J'ai une liste du formulaire suivant P>

<ul>
  <li *ngFor="let student of studentList| unique">
    {{student .name}}
  </li>
</ul>


0 commentaires

4 Réponses :


0
votes

Vous pouvez utiliser cette fonction dans votre tuyau:

var studentsList=[{name:"A",rollNo:1,mark:10},{name:"B",rollNo:2,mark:30},{name:"C",rollNo:3,mark:40},{name:"A",rollNo:1,mark:50}];

const resp = studentsList.reduce((acc, ele) => {
  const existingStudent = acc.find(x => x.name === ele.name);
  if(!existingStudent) return acc.concat(ele);
  return (existingStudent.mark += ele.mark, acc);
},[])

console.log(resp);


4 commentaires

Merci d'avoir répondu. Si l'étudiantlist est dynamique, alors cela fonctionnera-t-il?


Ce code est destructeur car il désigne les éléments de la liste d'entrée. Ce n'est pas siutable pour un tuyau en angulaire. Il est donc préférable d'l'utiliser à l'endroit où vous chargez et stockez les données.


signifie pas besoin d'écrire un tuyau?


@Anandraj "signifie pas besoin d'écrire un tuyau?" Cela signifie que lorsque vous faites cela juste après avoir chargé les données de votre contrôleur et stockez la matrice avec les valeurs accumulées, alors vous n'avez pas T Besoin d'un tuyau qui le fait lorsque vous rendant les données.



0
votes

Un exemple d'accumulation de vos valeurs.

p>

let studentsList = [
  { name: 'A', rollNo: 1, mark: 10 },
  { name: 'B', rollNo: 2, mark: 30 },
  { name: 'C', rollNo: 3, mark: 40 },
  { name: 'A', rollNo: 1, mark: 50 }
];

const byName = {};
for (var student of studentsList) {
  if (student.name in byName) {
    byName[student.name].mark += student.mark;
  } else {
    byName[student.name] = { ...student };
  }
}
console.log(Object.values(byName));


2 commentaires

Qu'est-ce que 3 points indiquent-il? moyens ...?


@Anandraj c'est un opérateur de propagation. Dans ce cas, {... Student} crée une copie peu profonde de étudiant de sorte que je ne mauve pas l'étudiant à partir du tableau d'entrée lorsque je fais Pyname [Student.name] .mark + = étudiant.mark .



2
votes

Si vous avez besoin d'une gamme de résultat de nom et de marques (somme des duplicats), vous pouvez le faire avec une manière très propre dans Lodash (puisque vous avez marqué Lodash). _.GroupBy le regroupera toujours par son paramètre unique et son groupe tous en duplivate avec ce paramètre à l'intérieur d'un tableau pour chaque groupe.

  1. Premièrement, regroupez-le par nom code> à l'aide de _.groupby a> li>
  2. alors carte ( .map em> ) Chaque groupe et calculer la somme des marques de .Sumby Li> ol>

    Voici un exemple de travail: p>

    p>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>


1 commentaires

Merci pour la solution géniale.



0
votes

Vous pouvez regrouper votre matrice d'étudiant sur le numéro de rouleau et ajouter les marques du même numéro de rouleau dans un accumulateur d'objet. Utilisation de Valeurs # Valeurs () CODE> Obtenez toutes les valeurs correspondant au numéro de rouleau.

p>

let studentsList = [{ name:'A', rollNo:1, mark:10 }, { name:'B', rollNo:2, mark:30 }, { name:'C', rollNo:3, mark:40 }, { name:'A', rollNo:1, mark:50 } ],
    uniqueStudents = Object.values(studentsList.reduce((r,{name, rollNo, mark}) => {
      r[rollNo] = r[rollNo] || {name, rollNo, total : 0};
      r[rollNo].total += mark;
      return r;
    },{}));
console.log(uniqueStudents);


0 commentaires