从javascript对象中重新获取值,然后将其转换为一个对象

时间:2018-05-07 15:32:01

标签: javascript arrays object

我有问题!我正在创建一个评级应用程序,我遇到了一个我不知道如何解决的问题。该应用程序是基于原生的反应,所以我使用JavaScript。 问题是我有多个几乎相同的对象,我想从“相同”对象的值中取出平均值,并创建一个新值,平均值作为新创建对象的新值< / p>

我的代码中的这个数组作为函数的参数

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 :(得分:0)

使用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);

答案 1 :(得分:0)

我猜你需要这样的东西:

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);
祝你好运!

答案 2 :(得分:0)

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;

答案 3 :(得分:0)

如果您可以选择使用underscore.js,问题就变得简单了:

  • 按名称
  • 对arr中的对象进行分组
  • 对于每个组,通过减少到它们的值之和并除以组长度来计算项目的平均值
  • 将每个组映射到包含名称和平均值
  • 的单个对象

<script src="http://underscorejs.org/underscore-min.js"></script>
for i in range(0, len(percent)):