Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.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 在多个条件下过滤具有多个属性的对象数组_Javascript - Fatal编程技术网

Javascript 在多个条件下过滤具有多个属性的对象数组

Javascript 在多个条件下过滤具有多个属性的对象数组,javascript,Javascript,我尝试在多个条件下过滤具有多属性的对象数组。所以我创建了一个param数组,它由多个保存参数的数组组成。比如说 var params = [ ["id", "equals", "11060"], ["user_id", "exact", "84"] ]; 第一个要素是关键,第二个要素是条件,第三个要素是价值。 所以第一个过滤条件是 id='11060'第二个是user\u id='84' // data to filter var originalData = [{

我尝试在多个条件下过滤具有多属性的对象数组。所以我创建了一个param数组,它由多个保存参数的数组组成。比如说

var params = [
    ["id", "equals", "11060"],
    ["user_id", "exact", "84"]
];
第一个要素是关键,第二个要素是条件,第三个要素是价值。 所以第一个过滤条件是
id='11060'
第二个是
user\u id='84'

// data to filter
    var originalData = [{
        "id": 11141,
        "user_id": 84,
        "received": "26 Jan 2017",
        "approvalstatus": "Approved"
    }, {
        "id": 11080,
        "user_id": 84,
        "received": "25 Jan 2017",
        "approvalstatus": "Approved"
    }, {
        "id": 11079,
        "user_id": 84,
        "received": "25 Jan 2017",
        "approvalstatus": "Approved"
    }, {
        "id": 11078,
        "user_id": 84,
        "received": "25 Jan 2017",
        "approvalstatus": "Approved"
    }, {
        "id": 11060,
        "user_id": 84,
        "received": "24 Jan 2017",
        "approvalstatus": "Approved"
    }];
下面是我的过滤功能

   filteredData = originalData.filter(function(item) {
        params.forEach(function(value, index) {
            var cond = value[1];
            var cKey = value[0];
            var cValue = value[2];
            var flag = false;
            if (cond == 'equals') {
                if (item[cKey] == Number(cValue)) {
                    flag = true;
                }
            } else if (cond == 'exact'){
                if (item[cKey].toString() == cValue) {
                    flag = true;
                }
            }
            return flag;
        });
        return false;
    });
但它不起作用。我做错了什么?蒂亚

如果执行forEach(),返回值将不会作为过滤函数的返回值传输。 此外,您还没有决定该值必须成功通过所有测试还是仅通过一个测试。我想所有的测试都必须成功通过。 如果只是其中一个,代码会略有不同

filteredData = originalData.filter(function(item) {
    var i, ntest, cKey, cValue, flag;
    for(i=0, ntest=params.length; i<ntest; ++i) {
        cKey = params[i][0];
        cValue = params[i][2];
        switch(params[i][1]) {
            case "equals":
                if(item[cKey] != Number(cValue)) return false;
            break;
            case "exact":
                if(item[cKey].toString() != cValue) return false;
            break;
        }
    }
    return true;
});
filteredData=originalData.filter(函数(项){
var i、ntest、cKey、cValue、flag;
对于(i=0,ntest=params.length;i执行forEach(),返回值将不会作为过滤函数的返回值传输。
另外,您还没有决定该值必须成功通过所有测试还是仅通过一个测试。我假设它必须成功通过所有测试。
如果只是其中一个,代码会略有不同

filteredData = originalData.filter(function(item) {
    var i, ntest, cKey, cValue, flag;
    for(i=0, ntest=params.length; i<ntest; ++i) {
        cKey = params[i][0];
        cValue = params[i][2];
        switch(params[i][1]) {
            case "equals":
                if(item[cKey] != Number(cValue)) return false;
            break;
            case "exact":
                if(item[cKey].toString() != cValue) return false;
            break;
        }
    }
    return true;
});
filteredData=originalData.filter(函数(项){
var i、ntest、cKey、cValue、flag;
对于(i=0,ntest=params.length;i问题:
您不能从
forEach
返回
forEach
将返回一个数组到
filter
并且数组是真实的。因此,结果数据将包含所有元素

解决方案:
for
可以用来代替
forEach
。要检查数组中的所有条件是否都满足,请检查
标志
是否设置为
false
,然后从那里返回以从结果数组中排除该元素

var originalData=[{
“id”:11141,
“用户id”:84,
“收到”:“2017年1月26日”,
“批准状态”:“已批准”
}, {
“id”:11080,
“用户id”:84,
“收到”:“2017年1月25日”,
“批准状态”:“已批准”
}, {
“id”:11079,
“用户id”:84,
“收到”:“2017年1月25日”,
“批准状态”:“已批准”
}, {
“id”:11078,
“用户id”:84,
“收到”:“2017年1月25日”,
“批准状态”:“已批准”
}, {
“id”:11060,
“用户id”:84,
“收到”:“2017年1月24日”,
“批准状态”:“已批准”
}];
变量参数=[
[“id”,“equals”,“11060”],
[“用户id”、“准确”、“84”]
];
filteredData=originalData.filter(函数(项){
var标志=假;
对于(变量i=0;i
问题: 您不能从
forEach
返回
forEach
将返回一个数组到
filter
并且数组是真实的。因此,结果数据将包含所有元素

解决方案:
for
可以用来代替
forEach
。要检查数组中的所有条件是否都满足,请检查
标志
是否设置为
false
,然后从那里返回以从结果数组中排除该元素

var originalData=[{
“id”:11141,
“用户id”:84,
“收到”:“2017年1月26日”,
“批准状态”:“已批准”
}, {
“id”:11080,
“用户id”:84,
“收到”:“2017年1月25日”,
“批准状态”:“已批准”
}, {
“id”:11079,
“用户id”:84,
“收到”:“2017年1月25日”,
“批准状态”:“已批准”
}, {
“id”:11078,
“用户id”:84,
“收到”:“2017年1月25日”,
“批准状态”:“已批准”
}, {
“id”:11060,
“用户id”:84,
“收到”:“2017年1月24日”,
“批准状态”:“已批准”
}];
变量参数=[
[“id”,“equals”,“11060”],
[“用户id”、“准确”、“84”]
];
filteredData=originalData.filter(函数(项){
var标志=假;
对于(变量i=0;i
您可以使用并检查每个条件

var params=[[“id”,“equals”,“11060”],[“user_id”,“exact”,“84”],
原始数据=[{id:11141,用户id:84,收到:“2017年1月26日”,批准状态:“批准”},{id:11080,用户id:84,收到:“2017年1月25日”,批准状态:“批准”},{id:11079,用户id:84,收到:“2017年1月25日”,批准状态:“批准”},{id:11078,用户id:84,收到:“2017年1月25日”,批准状态:“批准”},{id:11060,用户id:84,收到:“2017年1月24日”,批准状态:“批准”},
filteredData=originalData.filter(函数(项){
返回参数every(函数(值){
var cond=值[1],
cKey=值[0],
C值=值[2];
如果(cond=='equals'){
退货项目[cKey]==编号(C值);
}else if(cond==‘精确’){
返回项[cKey].toString()==cValue;
}
返回false;
});
});
console.log(filteredData);
.as控制台包装{max height:100%!important;top:0;}
您可以使用并检查每个con