验证Nodejs中的对象数组中的数据(Javascript)

时间:2018-02-27 17:35:05

标签: javascript arrays node.js object

我有一个使用MongoDB Aggregation框架从数据库查询生成的对象数组。

[ 
  { user_type: 'STUDENT', comments : 25  },
  { user_type: 'PARENT', comments: 35 },
  { user_type: 'TEACHER', comments: 26 },
  { user_type: 'PARENT', comments: 41 },
  { user_type: 'PRINCIPAL', comments: 60 },
]

mongodb的查询管道是这样的,只有当该用户类型的任何人对特定帖子发表评论时,如果来自{user_type没有评论,它将在数组中返回user_type {1}}该用户类型不会在数组中显示。

要完成一项任务,我需要检查是否所有人都已注释,如果是,则显示其计数,所以我需要检查数组是否至少有一个对象,每个user_type对照本地保存的列表,即PARENT, TEACHER, STUDENT, PRINCIAPL此列表可以随意改变。

编辑:我的要求是对象数组必须至少有一个对象,该对象具有每个本地保存列表的用户类型。

澄清:这里的评论数量是该类型的所有用户的评论,即如果两位教师评论了10条评论,那么user_type老师有20条评论

2 个答案:

答案 0 :(得分:1)

使用Array.prototype.reduce(),您可以在给定数组types的情况下为每个聚合注释计数创建一个属性。

function aggregateComments(results = [], types = []) {
  return types.reduce((acc, type) => {
    acc[type] = results.filter(
      ({ user_type }) => user_type === type
    ).reduce((sum, { comments }) => sum + comments, 0);

    return acc;
  }, {});
}

const results = [ 
  { user_type: 'STUDENT', comments : 25  },
  { user_type: 'PARENT', comments: 35 },
  { user_type: 'TEACHER', comments: 26 },
  { user_type: 'PARENT', comments: 41 },
  { user_type: 'PRINCIPAL', comments: 60 },
];
const types = ['STUDENT', 'PARENT', 'TEACHER', 'PRINCIPAL'];

console.log(aggregateComments(results, types));

答案 1 :(得分:1)

您可以从MongoDB的结果中获取user_types(函数map),然后检查该本地列表(过滤器)中的user_types是否都包含在内(函数{{1 }})。

every未包含在内,因此应返回DUMMY



false

var filter = ["STUDENT", "DUMMY"];
var array = [  { user_type: 'STUDENT', comments : 25  },  { user_type: 'PARENT', comments: 35 },  { user_type: 'TEACHER', comments: 26 },  { user_type: 'PARENT', comments: 41 },  { user_type: 'PRINCIPAL', comments: 60 },];

var mapped = array.map(o => o.user_type),
    result = filter.every((f) => mapped.includes(f));            
console.log(result);




包含所有.as-console-wrapper { max-height: 100% !important; top: 0; },因此应返回user_types



true

var filter = ["STUDENT", "PRINCIPAL", "TEACHER"];
var array = [  { user_type: 'STUDENT', comments : 25  },  { user_type: 'PARENT', comments: 35 },  { user_type: 'TEACHER', comments: 26 },  { user_type: 'PARENT', comments: 41 },  { user_type: 'PRINCIPAL', comments: 60 },];

var mapped = array.map(o => o.user_type),
    result = filter.every((f) => mapped.includes(f));    
console.log(result);