@NikesDark
Анализирую на диване

Как получить составляющий процент из объекта по полю?

Доброй ночи , не мог никак понятнее составить заголовок, за это извиняйте.
Проблема такова, есть такие данные
[{ FirstName: 'Pavel',      LastName: 'Pavlol',  Phone: '1234567',  Gender:'male' },
{ FirstName: 'Ivan', 	     LastName: 'Ivanov', Phone: '1234567',  Gender:'female' }]

из этого всего нужно получить :
[{"label":"Male",    "value":50}, 
 {"label":"Female", "value":50}];
  • Вопрос задан
  • 120 просмотров
Решения вопроса 3
mourr
@mourr
Passionate JS developer
Например, так (прошу прощения за грубый код,писал на коленке)
var arr = [{ FirstName: 'Pavel',      LastName: 'Pavlol',  Phone: '1234567',  Gender:'male' },
{ FirstName: 'Ivan', 	     LastName: 'Ivanov', Phone: '1234567',  Gender:'female' }];

var males = arr.filter((item)=>(item.Gender == 'male' ));
var females = arr.filter((item)=>(item.Gender == 'female'));
var result = [{
  "label" : "male",
  "value" : (males.length*100)/arr.length
},
{
 "label" : "female",
  "value" : (females.length*100)/arr.length
}]
Ответ написан
Комментировать
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Решил немного оптимизировать + унифицировать решение предложенное @mourr
function countFieldPersent(arr, field) {
    var data = arr.reduce((r, item) => {
        var value = String(item[field]);
        if(typeof r[value] === 'undefined') {
            r[value] = 0;
        }
        return ++r[value], r;
    }, {});
    return Object.getOwnPropertyNames(data).map(label => ({
        label,
        value : (data[label] * 100) / arr.length
    }));
}

var arr = [{ FirstName: 'Pavel',      LastName: 'Pavlol',  Phone: '1234567',  Gender:'male' },
{ FirstName: 'Ivan', 	     LastName: 'Ivanov', Phone: '1234567',  Gender:'female' }];
var result = countFieldPersent(arr, 'Gender');
Правда в моем варианте значения будут сравниваться как строки, так как я их перевожу в ключи объекта data
Ответ написан
Комментировать
@nikfakel
Веб-разработчик
var arr = [{ FirstName: 'Pavel',      LastName: 'Pavlol',  Phone: '1234567',  Gender:'male' },

  { FirstName: 'Ivan',       LastName: 'Ivanov', Phone: '1234567',  Gender:'female' }];
  var count = 0;

for (i=0;i<arr.length;i++){
  if (arr[i].Gender == 'male'){
    count++;
  }
}
var percentMale = Math.round(count / arr.length * 100);
var percentFemale = 100 - percentMale;

var arr2 = [{"label":"Male", "value":percentMale}, 
 {"label":"Female", "value":percentFemale}];


Решение конкретно под поля male и female. Формат того, что вам нужно получить, намекает, что надо то же самое по всем полям, но тогда пишите конкретнее.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы