如何处理对象收集中的数据

How to process data in object collection?

本文关键字:集中 数据 对象 何处理 处理      更新时间:2023-09-26

现在,在我的对象集合中,obj:

{date:2015/9/11,name:Ann,apple:1},
{date:2015/9/12,name:Ann,apple:0},
{date:2015/9/13,name:Ann,apple:1},
{date:2015/9/11,name:Bob,apple:1},.....

然后像这样打印出来:

2015/9/11  Ann     1  
2015/9/12  Ann     0  
2015/9/13  Ann     1  
2015/9/11  Bob     1  
2015/9/12  Bob     1  
2015/9/13  Bob     1  

我的代码

var index, objLen
for (index = 0, objLen = obj.length; index<objLen; ++index){
    console.log(obj[index].date +''t'+ obj[index].name +''t'+ result[index].apple)
}

我想输出:

2015/9/13  Ann     2  
2015/9/13  Bob     3 

这显示了Ann和Bob在这三天里吃了多少苹果

我想知道如何得到输出

您可以使用Array.prorotype.reduce将项目与相同的name合并,并将结果存储在对象中。

var obj = [
    { date: '2015/9/11', name: 'Ann', apple: 1 },
    { date: '2015/9/12', name: 'Ann', apple: 0 },
    { date: '2015/9/13', name: 'Ann', apple: 1 },
    { date: '2015/9/11', name: 'Bob', apple: 1 },
    { date: '2015/9/12', name: 'Bob', apple: 2 },
    { date: '2015/9/13', name: 'Bob', apple: 1 }
];
var merged = obj.reduce(function(merged, item) {
    if (!merged.hasOwnProperty(item.name)) {
        merged[item.name] = { date: item.date, name: item.name, apple: 0 };
    }
    merged[item.name].date = item.date;
    merged[item.name].apple += item.apple;
    return merged;
}, {});
// merged == {
//     Ann: { date: '2015/9/13', name: 'Ann', apple: 2 },
//     Bob: { date: '2015/9/13', name: 'Bob', apple: 4 }
// }

但是这个结果是一个以人名作为键的对象。如果您想将其转换回合并项的数组,您可以使用Object.keysArray.prototype.map的组合将merged对象的值生成一个数组:

merged = Object.keys(merged).map(function(item) {
    return merged[item];
});
// merged == [
//     { date: '2015/9/13', name: 'Ann', apple: 2 },
//     { date: '2015/9/13', name: 'Bob', apple: 4 }
// ]

你现在可以使用你的代码打印出这个数组的元素。

请参阅以下链接,以阅读有关此解决方案中使用的不同方法的更多信息:

  • Array.prototype.reduce
  • Array.prototype.map
  • Object.keys

根据传递的键对元素进行分组和计数的一种功能方法:

var obj = [{
  date: '2015/9/11',
  name: 'Ann',
  apple: 1
}, {
  date: '2015/9/12',
  name: 'Ann',
  apple: 0
}, {
  date: '2015/9/13',
  name: 'Ann',
  apple: 1
}, {
  date: '2015/9/11',
  name: 'Bob',
  apple: 1
}, {
  date: '2015/9/12',
  name: 'Bob',
  apple: 2
}, {
  date: '2015/9/13',
  name: 'Bob',
  apple: 1
}];
function groupBy(key, collenction) {
  return collenction.reduce(function(group, element) {
    if (!group[element[key]]) {
      group[element[key]] = [element]
    } else {
      group[element[key]].push(element)
    }
    return group
  }, {})
}
function countCollectionBy(key, collenction) {
  return Object.keys(collenction).reduce(function(memo, element) {
    memo[element] = countBy(key, collenction[element])
    return memo;
  }, {})
}
function countBy(key, collenction) {
  return collenction.reduce(function(memo, element) {
    return memo + element[key]
  }, 0)
}
alert(JSON.stringify(countCollectionBy('apple', groupBy('name', obj))))