如何处理对象收集中的数据
How to process data in object collection?
现在,在我的对象集合中,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.keys
和Array.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))))
相关文章:
- 用程序搜索JQuery数据表中的文本
- 要求输入在数据列表中
- 显示给定输入数字的数据集中字母表的所有可能组合
- 写循环以获取新行并附加到数据集中的旧行
- 在数据集中使用递归搜索 2D 数组模式
- 在控制台中显示数据集中的文本
- 使用大数据集中的旧/未发布数据进行刷新
- AngularJS在数据集中显示最大重现性属性
- 酒窝.js:不是按字母顺序排列y轴,而是按数据集中的出现顺序排列
- 仅从指定的字段集中提取数据
- angular中唯一的过滤选择列表,只返回数据集中的单个项
- 点击修改vis.js数据集中的项目内容
- 数据集中的新数据没有更新
- 其中是存储的数据表数据集中的数据
- 是否可以将纯文本存储在flotjquery数据集中
- 如何从JSON格式的数据集中提取DataTable
- 将php-json中的数据存储到javascript数据集中
- 如何从大数据集中进行搜索推荐
- 将 Ms Access 数据存储到 JavaScript 数据集中
- 使用谷歌地图 API 从物理地址数据集中检索一组坐标