我有两个数组,我想比较它们并提供主列表中项目的计数。
主列表可能如下所示:
{ name: 'Jon', age: 34 },
{ name: 'Steve', age: 33 },
{ name: 'Mark', age: 34 },
{ name: 'Jon', age: 35 }
过滤器列表从数据库中获取所有可能的姓名/年龄。有些可能没有任何条目。每个列表都是从 API 中单独获取的。我将它们组合成一个数组:
{ users:
[{ username: 'Jon' },
{ userName: 'Steve' },
{ username: 'Mark' },
{ username: 'Mike' }],
ages:
[{age: 33},
{age: 34},
{age: 35},
{age: 36}]
}
我想做的是能够计算出我有多少个名字
乔恩 - 2、史蒂夫 - 1、马克 - 1、迈克 - 0
33 - 1、34 - 2、35 - 1
最佳答案
这是一种通用方法。您提供数据和要计数的字段。
var data = [
{ name: 'Jon', age: 34 },
{ name: 'Steve', age: 33 },
{ name: 'Mark', age: 34 },
{ name: 'Jon', age: 35 }
];
function countUnique(items, property) {
return items.reduce(function(map, item) {
if (item.hasOwnProperty(property)) {
map[item[property]] = (map[item[property]] || 0) + 1;
}
return map;
}, {});
}
console.log(countUnique(data, 'name')); // Object {Jon: 2, Steve: 1, Mark: 1}
console.log(countUnique(data, 'age')); // Object {33: 1, 34: 2, 35: 1}
过滤
如果您想按条件过滤用户列表,您可以定义一个过滤器对象数组,如下所示。过滤项目列表时,您通常会提供 predicate function对过滤器调用中的当前项目执行。该函数返回一个 bool 值,用于确定该项目是否满足该函数的条件。
var users = [
{ name: 'Jon', age: 34 },
{ name: 'Steve', age: 33 },
{ name: 'Mark', age: 34 },
{ name: 'Jon', age: 35 }
];
var filters = [{
name: 'users',
predicate : function(user) {
return [ 'Jon', 'Mark', 'Mike' ].indexOf(user.name) > -1;
}
}, {
name: 'ages',
predicate : function(user) {
return user.age >= 34 && user.age <= 36;
}
}];
print(filterFactory(users, getFiltersByName(filters, ['users', 'ages'])));
function getFiltersByName(filters, names) {
return filters.filter(function(filter) {
return names.indexOf(filter.name) > -1;
});
}
function filterFactory(items, filters) {
return items.filter(function(item) {
return filters.some(function(filter) {
try { return filter.predicate.call(undefined, item); }
catch (e) { throw new Error('predicate undefined for filter: ' + filter.name); }
});
});
}
function print(obj) {
document.body.innerHTML = JSON.stringify(obj, undefined, ' ');
}
body { font-family: monospace; white-space: pre }
关于javascript - 比较两个数组以获取属性计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31006613/