Calcular porcentaje con alboroto -- javascript campo con lodash.js camp codereview Relacionados El problema

Calculate percentage with lodash


3
vote

problema

Español

Tengo datos como:

  var data =      [{         "date":"1-1-2013",         "answer":"yes"     },{         "date":"1-1-2013",         "answer":"no"     },{         "date":"2-1-2013",         "answer":"no"     },{         "date":"2-1-2013",         "answer":"no"     },{         "date":"2-1-2013",         "answer":" "       //this is not answered!     },,{         "date":"2-1-2013",         "answer":"no"            }];   

Necesito devolver porcentajes [Array] de respuestas para ese día ( 9988776655544331 ) que tienen un valor de "sí" para la "respuesta".

Por encima del resultado es: [50, 0...]

He escrito esto por debajo del código, funciona, pero creo que se puede simplificar mucho.

  var freshData =  _.map(data,function(key){     if (key.answer == "") return false;     return key;  });  var reducedData = _.filter(freshData, function(n) {     return n != false; });  var groups = _.groupBy(reducedData, function(value){         return value.date + '#' + value.answer; });  var result = _.map(groups,function(key){     if (key[0].answer == "") return false;     return {         date : key[0].date,         answer : key[0].answer,         length :key.length     }; });  var result2 = _.chunk(result,2);  var result3 =  _.map(result2,function(key){     return {         date:key[0].date,         yes:key[0].length,         no:key[1].length,         percentage : (key[1].length/(key[0].length + key[1].length) * 100)     } });  var result4 =  _.map(result3,function(key){ return  key.percentage; });  console.log(result4);   

Necesito usar alboroto. Gracias.

Original en ingles

I have data like:

var data =      [{         "date":"1-1-2013",         "answer":"yes"     },{         "date":"1-1-2013",         "answer":"no"     },{         "date":"2-1-2013",         "answer":"no"     },{         "date":"2-1-2013",         "answer":"no"     },{         "date":"2-1-2013",         "answer":" "       //this is not answered!     },,{         "date":"2-1-2013",         "answer":"no"            }]; 

I need to return[array] percentages of responses for that day(groupedBy) which have a value of xe2x80x9cyesxe2x80x9d for the xe2x80x9canswerxe2x80x9d.

For above the result is: [50, 0...]

I have written this below code, it works but i believe it can be simplified a lot.

var freshData =  _.map(data,function(key){     if (key.answer == "") return false;     return key;  });  var reducedData = _.filter(freshData, function(n) {     return n != false; });  var groups = _.groupBy(reducedData, function(value){         return value.date + '#' + value.answer; });  var result = _.map(groups,function(key){     if (key[0].answer == "") return false;     return {         date : key[0].date,         answer : key[0].answer,         length :key.length     }; });  var result2 = _.chunk(result,2);  var result3 =  _.map(result2,function(key){     return {         date:key[0].date,         yes:key[0].length,         no:key[1].length,         percentage : (key[1].length/(key[0].length + key[1].length) * 100)     } });  var result4 =  _.map(result3,function(key){ return  key.percentage; });  console.log(result4); 

I need to use lodash. Thanks.

     

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Solución con LUDASH:

  Point2D4  
 

solution with lodash:

var data = [{     "date": "1-1-2013",         "answer": "yes" }, {     "date": "1-1-2013",         "answer": "no" }, {     "date": "2-1-2013",         "answer": "no" }, {     "date": "2-1-2013",         "answer": "no" }, {     "date": "2-1-2013",         "answer": " " //this is not answered! }, {     "date": "2-1-2013",         "answer": "no" }];  //var grouped = _.groupBy(data, 'date'); var all = _.map(_.groupBy(data, 'date'), function (item, key) {     console.log(key);     var size = item.length,         obj={};     var positiveCount = _.countBy(item, function (i) {         return i.answer == "yes" ? "yes" : "no";     });     var percentagePossitive = (positiveCount.yes / size) * 100;     obj[key] = percentagePossitive || 0;     return obj; });  console.log(all) 
 
 
5
 
vote

Crear una cadena de Lodash, use _.Groupby () para obtener un mapa de fechas y luego reducirlo a los porcentajes:

  99887766555443325  
  Point2D6  
 

Create a lodash chain, use _.groupBy() to get a dates map, and then reduce it to percentages:

function getNumOfYes(data) {    return _(data).groupBy('date').reduce(function(percentage, answers) {      var numOfYes = _.countBy(answers, 'answer').yes || 0;      percentage.push(numOfYes / answers.length * 100);      return percentage;    }, []);  }    var data = [{    "date": "1-1-2013",    "answer": "yes"  }, {    "date": "1-1-2013",    "answer": "no"  }, {    "date": "2-1-2013",    "answer": "no"  }, {    "date": "2-1-2013",    "answer": "no"  }, {    "date": "2-1-2013",    "answer": " " //this is not answered!  }, , {    "date": "2-1-2013",    "answer": "no"  }];    var numOfYes = getNumOfYes(data);    console.log(numOfYes);    document.getElementById('results').innerText = JSON.stringify(numOfYes);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>    <pre id="results"></pre>
 
 
3
 
vote

Puede utilizar un objeto temporal para contar y devolver una matriz de objetos con fecha y porcentaje.

  var data = [{         "date": "1-1-2013",         "answer": "yes"     }, {         "date": "1-1-2013",         "answer": "no"     }, {         "date": "2-1-2013",         "answer": "no"     }, {         "date": "2-1-2013",         "answer": "no"     }, {         "date": "2-1-2013",         "answer": " "       //this is not answered!     }, , {         "date": "2-1-2013",         "answer": "no"     }];  function getPercentage(data) {     var obj = {};     data.forEach(function (a) {         if (~['yes','no'].indexOf(a.answer)) {                             obj[a.date] = obj[a.date] || { yes: 0, no: 0 };             obj[a.date][a.answer]++;         }     });     return Object.keys(obj).map(function (k) {         return {              date: k,             percent: obj[k].yes * 100 / (obj[k].yes + obj[k].no)         };     }); } document.write('<pre>' + JSON.stringify(getPercentage(data), 0, 4) + '</pre>');  
 

You can utilize a temporary object for counting and returns an array of objects with date and percentage.

var data = [{         "date": "1-1-2013",         "answer": "yes"     }, {         "date": "1-1-2013",         "answer": "no"     }, {         "date": "2-1-2013",         "answer": "no"     }, {         "date": "2-1-2013",         "answer": "no"     }, {         "date": "2-1-2013",         "answer": " "       //this is not answered!     }, , {         "date": "2-1-2013",         "answer": "no"     }];  function getPercentage(data) {     var obj = {};     data.forEach(function (a) {         if (~['yes','no'].indexOf(a.answer)) {                             obj[a.date] = obj[a.date] || { yes: 0, no: 0 };             obj[a.date][a.answer]++;         }     });     return Object.keys(obj).map(function (k) {         return {              date: k,             percent: obj[k].yes * 100 / (obj[k].yes + obj[k].no)         };     }); } document.write('<pre>' + JSON.stringify(getPercentage(data), 0, 4) + '</pre>');
 
 
3
 
vote

Respuesta en JS Fiddle (verifique la consola)

Nota, he usado Lodash, pero realmente no lo necesita para esto: -)

  var sortedResults = {}; // create empty object  /**  * sort all the answers on date  */ _.map(data, function(val){     if(typeof val !== 'undefined'){ // check if not undefined         if(val.answer==='yes' || val.answer==='no'){ // should be yes or no             if (typeof(sortedResults[val.date]) === 'undefined') {                 sortedResults[val.date] = []; // if data is not available, add it as an array             }             sortedResults[val.date].push(val.answer); // push the answer to the array         }     } });  /**  * Calculate the percentages of 'yes'  */ _.map(sortedResults, function(val, key){     var percentage    = val.length, // get total length         percentageYes = 0; // before map function percentage = 0     _.each(val, function(singleVal){         if(singleVal === 'yes'){ percentageYes++; }     });     sortedResults[key] = { yesPercent: percentageYes / percentage * 100 }; });  /**  * Percentage is available in sortedResults;  */ console.log(sortedResults);   
 

Answer in JS fiddle (check console)

Note, I've used Lodash, but you don't really need it to this :-)

var sortedResults = {}; // create empty object  /**  * sort all the answers on date  */ _.map(data, function(val){     if(typeof val !== 'undefined'){ // check if not undefined         if(val.answer==='yes' || val.answer==='no'){ // should be yes or no             if (typeof(sortedResults[val.date]) === 'undefined') {                 sortedResults[val.date] = []; // if data is not available, add it as an array             }             sortedResults[val.date].push(val.answer); // push the answer to the array         }     } });  /**  * Calculate the percentages of 'yes'  */ _.map(sortedResults, function(val, key){     var percentage    = val.length, // get total length         percentageYes = 0; // before map function percentage = 0     _.each(val, function(singleVal){         if(singleVal === 'yes'){ percentageYes++; }     });     sortedResults[key] = { yesPercent: percentageYes / percentage * 100 }; });  /**  * Percentage is available in sortedResults;  */ console.log(sortedResults); 
 
 

Relacionados problema

6  Consejo de pedido de objetos por fecha de propiedad  ( Order array of objects by date property ) 
Aquí hay una función que ordena una matriz de objetos con un public sealed class PhysicsManager { // Thread-Safe Singleton Pattern Definition private...

3  Función que grupos grifos regresaron de SQL DB  ( Function that groups rows returned from sql db ) 
Tengo un conjunto de datos devuelto de una base de datos SQL contenida a continuación, ya que puede ver que todos los datos siguen siendo el mismo aparte de u...

0  Función para asegurar que se seleccione al menos una opción  ( Function to ensure that at least one choice is selected ) 
Primero aquí está mi objeto settings a continuación. insight , spike3 y momentum están encuestados a 3 casillas de verificación en el markup. El obj...

4  Generando una matriz de valores únicos de una propiedad específica en una matriz de objetos  ( Generating an array of unique values of a specific property in an object array ) 
Dada una tabla representada como una matriz de objetos JavaScript, me gustaría crear una lista de valores únicos para una propiedad específica. using S...

3  Implementación del sistema de "gestión de tareas diurnas" usando Django y Angularjs  ( Implementing day wise task management system using django and angularjs ) 
Tengo un modelo 9988777665544330 en Django que se parece a lo siguiente: class Task(TimeStampedModel): project = models.ForeignKey(Project, related_n...

3  Iterando a través de un rango usando Lodash / Angularjs y guardando datos  ( Iterating through a range using lodash angularjs and saving data ) 
El código a continuación no me parece correcto. El escenario es: El usuario ingresa en una "cantidad" en un campo de formulario. Si el usuario entra en 5...

1  Parser de mensaje de JavaScript  ( Javascript message parser ) 
Estoy tratando de hacer una especie de analizador de mensajes. He escrito este código. Literalmente funciona, pero en mi opinión, se parece a un exceso. ¿Tien...

1  Comprobación si algún competidor tiene un nombre no vacío [cerrado]  ( Checking if any competitors have a non empty name ) 
cerrado . Esta pregunta necesita detalles o claridad . Actualmente no está aceptando respuestas. ...

-2  ¿Qué es una forma más limpia de pasar una función una serie de valores y luego ordenar mi objeto por esos valores?  ( Whats a cleaner way to pass a function an array of values and then sort my obje ) 
El código de trabajo: var dict = [ {name: 'random234'}, {name: 'random843'} ] function organizeObject(dict) { var resultArray = []; ...

1  Obtenga un objeto con valores nulos de una matriz de objetos anidados  ( Get an object with null values from an array of nested objects ) 
Tengo una matriz de objetos anidados. ¿Cómo obtengo un objeto con valores nulos usando solo una clave particular en la matriz de objetos? dates18 d...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos