Pregunta acceder al objeto matriz dentro de una función de orden superior


Estoy tratando de acceder a la longitud de la matriz en la que estoy usando una función de reducción dentro de esa reducción, pero parece que no puedo hacerlo, ¿alguien tiene alguna idea de si es posible acceder a la matriz objeto dentro de cualquiera de las funciones de orden superior?

PD: intenté usar this pero sin éxito;

PSS: quiero calcular la clasificación promedio usando una función de reducción, por lo que utilizo reducir para sumar todos los valores en la matriz y dividir esos mismos valores por la longitud de la matriz, de esta manera:

let averageRating = watchList
    .filter(movie => movie.Director === 'Christopher Nolan')
    .map(x => parseFloat(x.imdbRating))
    .reduce((total, current) => total + (current / 'array length'));

donde 'longitud de matriz' sería, lo adivinaste, la longitud de la matriz.

PSSS: probado

var averageRating = watchList
  .filter(movie => movie.Director === 'Christopher Nolan')
  .map(x => parseFloat(x.imdbRating))
  .reduce((total, current, index, arr) => total + (current / arr.length));

pero la longitud de la matriz cambia constantemente a medida que se reduce la matriz, por lo que no funcionaría para mis propósitos.


7
2018-02-26 01:13


origen


Respuestas:


Esto debería hacerlo:

let averageRating = watchList
    .filter(movie => movie.Director === 'Christopher Nolan')
    .map(x => parseFloat(x.imdbRating))
    .reduce((total, current, idx, arr) => total + (current / arr.length));

Actualizar

Si está interesado en ver cómo lo haría en mi biblioteca preferida, Ramda (descargo de responsabilidad: yo soy uno de sus principales autores) el código le gustaría así:

const {pipe, filter, propEq, pluck, map, mean} = R;

const watchList = [{"Director": "Christopher Nolan", "imdbRating": 4.6, "title": "..."}, {"Director": "Michel Gondry", "imdbRating": 3.9, "title": "..."}, {"Director": "Christopher Nolan", "imdbRating": 2.8, "title": "..."}, {"Director": "Christopher Nolan", "imdbRating": 4.9, "title": "..."}, {"Director": "Alfred Hitchcock", "imdbRating": 4.6, "title": "..."}, {"Director": "Christopher Nolan", "imdbRating": 4.6, "title": "..."}];

const averageRating = pipe(
  filter(propEq('Director', 'Christopher Nolan')),
  pluck('imdbRating'),
  map(Number),
  mean
);

console.log(averageRating(watchList));
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

Encuentro que esto conduce a un código realmente limpio y legible.


4
2018-02-26 01:21



Puedes intentar esto:

let averageRating = watchList
        .filter(movie => movie.Director === 'Christopher Nolan')
        .map(x => parseFloat(x.imdbRating))
        .reduce((total, current, index, array) => {
            total += current;
            if( index === array.length - 1) {
               return total/array.length;
            } else {
               return total;
            }
        });

3
2018-02-26 01:33



Preguntas populares