我正在尝试使用Lodash过滤数组。问题是,在我的主数组中,一些数组元素是对象,一些是数组中的对象。我想使用一个处理两种方案的过滤器。当我首先尝试使用var的代码时,我只得到了事件编号270188929,但是当我尝试使用var秒代码时,我只得到了事件编号370188929.是否可以编写一个具有嵌套对象定义的过滤器来处理这两个事件?或者我需要一个功能?是这样,什么功能会起作用?
这是我的代码:
var array = [{
"category": "test",
"incidentInformation": {
"incidentNumber": "270188929",
},
"numberInformation": {
"number": "1",
"type": "moderate",
},
}, {
"category": "test2",
"incidentInformation": {
"incidentNumber": "370188929",
},
"numberInformation": [{
"number": "1",
"type": "moderate",
}, {
"number": "1",
"type": "moderate",
}]
}];
var first = _.filter(array, {
numberInformation: {
type: "moderate"
}
});
var second = _.filter(array, {
numberInformation: [{
type: "moderate"
}]
});
答案 0 :(得分:1)
如果您想将这两个标准合并为一个过滤器,我建议cond()
:
_.filter(array, _.cond([
[v => v.numberInformation.type === 'moderate', _.stubTrue],
[v => _.some(v.numberInformation, { type: 'moderate' }), _.stubTrue]]
));
传递给cond()
的对是条件函数,后跟值函数。这个想法是条件将继续评估项目,直到一个返回true,或直到它们用完为止。找到某些内容后,会返回true
值进行过滤。
使用这种方法,维护逻辑更容易,因为它是声明性的。
答案 1 :(得分:0)
var first= _.filter(array, function(o) {
return o.numberInformation.type == 'moderate';
});
var second = _.filter(array, function (o) {
return _.some(o.numberInformation, { 'type': 'moderate' });
});
答案 2 :(得分:0)
您不需要任何库来过滤对象列表。您只需使用filter()
方法
var matchingItems = array.filter(function(item) {
return item.numberInformation.type == 'moderate';
});
答案 3 :(得分:0)
Why not encapsulate what it is to be moderate in a predicate:
var isModerate = function(item){
return item.numberInformation.type == 'moderate' ||
_.some(item.numberInformation, {type: 'moderate'});
}
And then use that in a filter (or wherever else you may need it):
var result = _.filter(array, isModerate);
To make it more generic you could create a function that returns a predicate for you:
var isOfType = function(type) {
return function(item){
return item.numberInformation.type == type ||
_.some(item.numberInformation, {type: type});
}
}
var result = _.filter(array, isOfType('moderate'));