Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Lodash筛选嵌套对象--得到不一致的结果_Javascript_Lodash - Fatal编程技术网

Javascript 使用Lodash筛选嵌套对象--得到不一致的结果

Javascript 使用Lodash筛选嵌套对象--得到不一致的结果,javascript,lodash,Javascript,Lodash,我正在尝试使用Lodash筛选数组。问题是,在我的主数组中,有些数组元素是对象,有些是数组中的对象。我想使用一个过滤器来处理这两种情况。当我第一次尝试使用var代码时,我只得到了事件号270188929,但当我第二次尝试使用var代码时,我只得到了事件号370188929。是否可以编写一个包含嵌套对象定义的过滤器,该对象定义将同时处理这两种情况?还是我需要一个函数?如果是这样,什么功能会起作用 这是我的密码: var array = [{ "category": "test", "inciden

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

您不需要任何库来过滤对象列表。您只需使用
filter()
方法即可

var matchingItems = array.filter(function(item) { 
    return item.numberInformation.type == 'moderate'; 
 });

为什么不在谓词中封装适度的含义:

var isModerate = function(item){
    return item.numberInformation.type == 'moderate' || 
           _.some(item.numberInformation, {type: 'moderate'});
}
然后将其用于过滤器(或任何您可能需要的地方):

为了使其更通用,您可以创建一个函数,为您返回谓词:

var isOfType = function(type) {

    return function(item){
        return item.numberInformation.type == type || 
               _.some(item.numberInformation, {type: type});
    }
}

var result = _.filter(array, isOfType('moderate'));

如果您想将这两个条件组合成一个过滤器,我建议您使用
cond()

传递给
cond()
的对是条件函数,后跟值函数。其思想是,条件将不断评估项,直到返回true,或者直到它们用完为止。当找到某个内容时,将向筛选器返回一个
true


使用这种方法,维护逻辑更容易,因为它是声明性的。

请标记最佳答案。我认为您打算在两个返回语句中使用==而不是=。在本例中,两个返回语句(with=和with==)都起作用,但当我在完整的应用程序中尝试时,=更改了数据。我选择这个作为最佳答案,因为一旦我将=改为==它就起作用了。我还认为这个答案更简单。我很欣赏通用函数。我羞愧地低下头:)。学童错误。谢谢你指出这一点。这个答案有效。我之所以选择它,并不是因为我喜欢Gruff Bunny的答案,我觉得这个答案更容易理解,并且提供了一个可以在其他情况下使用的通用函数。你能解释一下uu.cond()方法的好处吗?这个答案不起作用。它只返回了第一个事件编号。尽管这个答案有效,但它不使用一个过滤器来处理作为对象的数组元素和作为数组中对象的数组元素。这个答案确实有助于解释为什么我的代码不起作用。
var result = _.filter(array, isModerate);
var isOfType = function(type) {

    return function(item){
        return item.numberInformation.type == type || 
               _.some(item.numberInformation, {type: type});
    }
}

var result = _.filter(array, isOfType('moderate'));
_.filter(array, _.cond([
  [v => v.numberInformation.type === 'moderate', _.stubTrue],
  [v => _.some(v.numberInformation, { type: 'moderate' }), _.stubTrue]]
));