如何处理对象集合中的数据?

时间:2015-09-11 13:46:25

标签: javascript arrays node.js

现在,在我的对象集合中,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在这三天内吃了多少苹果

我想知道如何获得输出。

2 个答案:

答案 0 :(得分:1)

您可以使用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 }
// }

但是这一个会导致一个以人名作为关键字的对象。如果要将其转换回合并项目数组,可以使用mergedObject.keys的组合从Array.prototype.map对象的值中创建数组:

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 }
// ]

然后,您现在可以使用您的代码打印出此数组的元素。

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

答案 1 :(得分:0)

通过传递键对group和count元素的一些功能方法:

&#13;
&#13;
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))))
&#13;
&#13;
&#13;