Javascript 如何检查对象是否符合某些规则?

Javascript 如何检查对象是否符合某些规则?,javascript,node.js,Javascript,Node.js,我有一个类似对象的数组。我需要一个通用模板来编写此数组的筛选规则。 例如,我有一系列电影: const movies = [{ title: 'movie 1', type: 'tv', genres: ['comedy', 'romantic'] }, { title: 'movie 2', type: 'serial', genres: ['comedy', 'romantic'] }, { title: 'movie 3',

我有一个类似对象的数组。我需要一个通用模板来编写此数组的筛选规则。 例如,我有一系列电影:

const movies = [{
    title: 'movie 1',
    type: 'tv',
    genres: ['comedy', 'romantic']
}, {
    title: 'movie 2',
    type: 'serial',
    genres: ['comedy', 'romantic']
}, {
    title: 'movie 3',
    type: 'tv',
    genres: ['romantic', 'horror']
}]
和规则

// Is Comedy movie
const rule = {
    relation: 'AND',
    items: [{
        property: 'type',
        value: 'tv'
    }, {
        property: 'genres',
        value: 'comedy'
    }]
}
检查结果:

// An improvised example of checking an object by a rule
checkObjByRule(rule, movies[0]) // -> true
checkObjByRule(rule, movies[1]) // -> false
checkObjByRule(rule, movies[2]) // -> false
在实际工作中,对象
电影
,要复杂得多,有许多嵌套属性。我试图找到一个现成的解决方案,一个库,这样我就可以创建复杂的规则并检查它们

var电影=[{
标题:"电影一",,
键入:“tv”,
类型:[“喜剧”、“浪漫”]
}, {
标题:"电影2",,
类型:“串行”,
类型:[“喜剧”、“浪漫”]
}, {
标题:"电影3",,
键入:“tv”,
类型:[“浪漫”、“恐怖”]
}];
var规则={
关系:'和',
项目:[{
属性:“类型”,
价值观:“电视”
}, {
属性:'流派',
价值观:“喜剧”
}]
}
函数处理规则(obj,规则){
返回规则.items.reduce(函数(a,b){
如果(a的类型!=“布尔”){
var compareVal=obj[a.属性];
//比较此处的值
a=Array.isArray(compareVal)?compareVal.includes(a.value):compareVal==a.value;
}
compareVal=obj[b.属性];
b=Array.isArray(compareVal)?compareVal.includes(b.value):compareVal==b.value;
//根据关系使用逻辑运算符
return rule.relation==“AND”?a&&b:a | | b;
});
}
log(processRules(电影[0],规则));
log(processRules(movies[1],rule));

log(processRules(movies[2],rule))
您可以使用对象作为关系,并为
关系使用对象

var movies=[{title:'movie 1',type:'tv',流派:['喜剧片','romatic']},{title:'movie 2',type:'serial',流派:['喜剧片','romatic']},{title:'movie 3',type:'tv',流派:['romatic','horror']},
规则={relation:'AND',items:[{property:'type',value:'tv'},{property:'genres',value:'comic'}]},
结果=movies.filter(
o=>rule.items[{AND:'every',或'some'}[rule.relation]](
r=>o[r.property]。包括(r.value)
)
);
控制台日志(结果)

作为控制台包装{max height:100%!important;top:0;}
请求库是ot,请求就绪也是ot。你可以自己试试,问问它是否工作正常。