javascript - 比较两个数组以获取属性计数

标签 javascript angularjs

我有两个数组,我想比较它们并提供主列表中项目的计数。

主列表可能如下所示:

{ 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/

相关文章:

javascript - 扩大quora中的 'more'链接

javascript - AJAX 删除表中选择了 PHP id 的行

javascript - 使用 Mechanize for Python 模拟简单的 javascript (location.href=)

javascript - 针对不同域之间实时聊天的技术堆栈建议

javascript - AngularJs:选择下拉列表在使用 ng-repeat 时不显示任何选项

ajax - 如何配置 Restangular URL 构建的 Id 属性

javascript - 查看多个 $scope 属性

html - 使用 css 创建三 Angular 形的框阴影

javascript - 如何在悬停时切换动画

javascript - AngularJS 应用程序中部署服务器上的相对路径问题