使用Lodash过滤嵌套对象 - 获得不一致的结果

时间:2017-05-01 13:34:14

标签: javascript lodash

我正在尝试使用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"
}]
});

4 个答案:

答案 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'));