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