получение значений из объекта JavaScript, а затем преобразование его в один объект - PullRequest
0 голосов
/ 07 мая 2018

У меня проблема! Я создаю рейтинговое приложение и столкнулся с проблемой, которую не знаю, как решить. Приложение работает на нативной основе, поэтому я использую JavaScript. Проблема в том, что у меня есть несколько почти одинаковых объектов, я хочу извлечь среднее значение из значений «одинаковых» объектов и создать новое со средним значением в качестве нового значения вновь созданного объекта

Этот массив в моем коде является параметром для функции

var arr = [
        {"name":"foo","value":2},
        {"name":"foo","value":5},
        {"name":"foo","value":2},
        {"name":"bar","value":2},       
        {"name":"bar","value":1}
    ]

и я хочу получить результат

var newArr = [    
        {"name":"foo","value":3},
        {"name":"bar","value":1.5},  
     ]

Если кто-нибудь сможет мне помочь, я буду очень признателен! конечно, это не мой точный код, так что другие тоже могут получить помощь, если вы хотите, чтобы мой код помог мне, я могу отправить его, если это необходимо Если у вас есть какие-либо вопросы, я с радостью отвечу на эти

Ответы [ 4 ]

0 голосов
/ 07 мая 2018

Если у вас есть возможность использовать underscore.js, проблема становится простой:

  • сгруппировать объекты в arr по имени
  • для каждой группы вычислите среднее значение предметов, уменьшив до суммы их значений и разделив на длину группы
  • сопоставить каждую группу с одним объектом, содержащим имя и среднее значение

var arr = [ 
      obj = {
        name: "foo", 
        Value: 2
      },
      obj = {
        name: "foo", 
        Value: 5
      },
      obj = {
        name: "foo", 
        Value: 2
      },
      obj = {
        name: "bar", 
        Value: 2
      },
      obj = {
        name: "bar", 
        Value: 1
      }
]

// chain the sequence of operations
var result = _.chain(arr)
 // group the array by name
 .groupBy('name')
 // process each group
 .map(function(group, name) {
   // calculate the average of items in the group
   var avg = (group.length > 0) ? _.reduce(group, function(sum, item) { return sum + item.Value }, 0) / group.length : 0;
   return {
     name: name,
     value: avg
   }
 })
 .value();
 
console.log(result);
<script src="http://underscorejs.org/underscore-min.js"></script>
0 голосов
/ 07 мая 2018

Полагаю, вам нужно что-то вроде этого:

let arr = [
        {name: "foo", Value: 2},
        {name: "foo", Value: 5},
        {name: "foo", Value: 2},
        {name: "bar", Value: 2},
        {name: "bar", Value: 1}
    ];

let tempArr = [];
arr.map((e, i) => {
    tempArr[e.name] = tempArr[e.name] || [];
    tempArr[e.name].push(e.Value);
});

var newArr = [];
$.each(Object.keys(tempArr), (i, e) => {
    let sum = tempArr[e].reduce((pv, cv) => pv+cv, 0);
    newArr.push({name: e, value: sum/tempArr[e].length});
});
console.log(newArr);

Удачи!

0 голосов
/ 07 мая 2018

В arr у вас есть свойство Value, а в newArr у вас есть свойство value, поэтому я буду считать, что оно равно value. Пожалуйста, измените, если хотите иначе.

var map = {};

for(i = 0; i < arr.length; i++)
{
  if(typeof map[arr[i].name] == ‘undefined‘)
  {
    map[arr[i].name] = {
       name: arr[i].name,
       value: arr[i].value,
       count: 1,
     };
  } else {
    map[arr[i].name].value += arr[i].value;
    map[arr[i].name].count++;
}

var newArr = [];
for(prop in map)
{
  map[prop].value /= map[prop].count;

  newArr.push({
    name: prop,
    value: map[prop].value
  });
}

delete map;
0 голосов
/ 07 мая 2018

Итерируйте массив с Array.reduce() и соберите объект, используя значения name в качестве ключа. Суммируйте атрибут Value каждого имени в total и увеличивайте count.

Преобразовать объект обратно в массив, используя Object.values(). Итерируйте новый массив с Array.map() и получите среднее значение value, разделив total на count:

const arr = [{"name":"foo","Value":2},{"name":"foo","Value":5},{"name":"foo","Value":2},{"name":"bar","Value":2},{"name":"bar","Value":1}];

const result = Object.values(arr.reduce((r, { name, Value }) => {
  if(!r[name]) r[name] = { name, total: 0, count: 0 };
  
  r[name].total += Value;
  r[name].count += 1;
  
  return r;
}, Object.create(null)))
.map(({ name, total, count }) => ({
  name,
  value: total / count
}));

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...