下面是对象的示例数组。我希望在criteriaType
,id
和source
的基础上过滤这个。如果没有匹配的input.source
,父对象应该被过滤掉。此外,所有过滤条件都是可选的。
[{
"id": "9be6c6299cca48f597fe71bc99c37b2f",
"caption": "caption1",
"criteriaType": "type2",
"input": [
{
"id_1": "66be4486ffd3431eb60e6ea6326158fe",
"criteriaId": "9be6c6299cca48f597fe71bc99c37b2f",
"source": "type1",
},
{
"id_1": "1ecdf410b3314865be2b52ca9b4c8539",
"criteriaId": "9be6c6299cca48f597fe71bc99c37b2f",
"source": "type2",
}
]
},
{
"id": "b83b3f081a7b45e087183740b12faf3a",
"caption": "caption1",
"criteriaType": "type1",
"input": [
{
"id_1": "f46da7ffa859425e922bdbb701cfcf88",
"criteriaId": "b83b3f081a7b45e087183740b12faf3a",
"source": "type3",
},
{
"id_1": "abb87219db254d108a1e0f774f88dfb6",
"criteriaId": "b83b3f081a7b45e087183740b12faf3a",
"source": "type1",
}
]
},
{
"id": "fe5b071a2d8a4a9da61bbd81b9271e31",
"caption": "caption1",
"criteriaType": "type1",
"input": [
{
"id_1": "7ea1b85e4dbc44e8b37d1110b565a081",
"criteriaId": "fe5b071a2d8a4a9da61bbd81b9271e31",
"source": "type3",
},
{
"id_1": "c5f943b61f674265b8237bb560cbed03",
"criteriaId": "fe5b071a2d8a4a9da61bbd81b9271e31",
"source": "type3",
}
]
}]
我能够实现仅按criteriaType
& id
过滤。但是,如果没有匹配的input.source,我也不能通过source
过滤来确保不返回父级。
var json = <<array of objects>> ;
const {objectId: id, ctype: criteriaType, inputSource: source } = param; // getting the the params
json = ctype ? json.filter(({criteriaType}) => criteriaType === ctype ): json;
json = (objectId ? json.filter(({id}) => id === objectId ): json)
.map (({id, caption, criteriaType, input }) => {
//some manipulation
return { //results after manipulation}
})
帮帮我!提前谢谢。我不确定我们是否可以用链式过滤器来实现它。
寻找与esLint兼容的代码
发布于 2018-07-26 06:58:01
requirements be是可选的,没有一个源匹配parent不应该返回https://jsfiddle.net/cpk18dt4/9/
注释在代码中。希望它能解释这个函数的作用。
const fnFilter = (criteriaType, id, source) => {
let result = oData;
if (criteriaType) { // it can be null (optional)
result = result.filter(d => d.criteriaType === criteriaType);
}
if (id) { // it can be null (optional)
result = result.filter(d => d.id === id);
}
if (source) { // it can be null (optional)
result = result.filter(d => {
const inputs = d.input.filter(inp => inp.source === source);
// If none of the input.source match, the parent object should be filtered out
if (inputs.length === 0) {
return false;
}
d.input = inputs;
return true;
});
}
return result;
};
发布于 2018-07-26 06:24:49
有几种方法可以做到这一点。您可以在纯JS中实现这一点,我推荐使用Lodash
1) Lodash filters
``` javascript
var用户=[
{ 'user':'barney','age':36,'active':true },
{ 'user':'fred','age':40,'active':false }
];
_.filter(用户,函数(O){ return !o.active;});
// 'fred‘的=>对象
// _.matches
迭代器速记。
_.filter(用户,{‘年龄’:36,‘活跃’:真});
// 'barney‘的=>对象
// _.matchesProperty
迭代器速记。
_.filter(users,'active',false);
// 'fred‘的=>对象
// _.property
迭代器速记。
_.filter(用户,‘活动’);
// 'barney‘的=>对象
2) JavaScript ES5 filter()
``` javascript
var word=‘喷雾’,‘极限’,‘精英’,‘旺盛’,‘毁灭’,‘现在’;
var result =单词
.filter(word => word.length > 6)
.filter(word => word.length < 8);
Console.log(结果);
//预期输出: Array "present“
2) MapReduce
MapReduce是我最喜欢的处理集合/集合的工具之一。
您在上面的代码中使用了map()
。诀窍可能是将map
更改为reduce
。
使用map
,您可以获得1:1的收藏项进出比率。
使用reduce
,您可以根据需要为输入中的每一项生成任意多的项。例如。
``` javascript
var stuff =‘沙发’,‘椅子’,‘桌子’;
var hasFiveLetters =stuff.reduce((总数,项目) => {
if (item.length === 5) total.push(item);//添加任何您喜欢的项目
return total;//别忘了返回total!
},[]);//将total初始化为[]
console.log(hasFiveLetters);//‘沙发’,‘椅子’;
发布于 2018-07-26 07:30:50
试试这个:
var obj = [{
"id": "9be6c6299cca48f597fe71bc99c37b2f",
"caption": "caption1",
"criteriaType": "type2",
"input": [
{
"id_1": "66be4486ffd3431eb60e6ea6326158fe",
"criteriaId": "9be6c6299cca48f597fe71bc99c37b2f",
"source": "type1",
},
{
"id_1": "1ecdf410b3314865be2b52ca9b4c8539",
"criteriaId": "9be6c6299cca48f597fe71bc99c37b2f",
"source": "type2",
}
]
},
{
"id": "b83b3f081a7b45e087183740b12faf3a",
"caption": "caption1",
"criteriaType": "type1",
"input": [
{
"id_1": "f46da7ffa859425e922bdbb701cfcf88",
"criteriaId": "b83b3f081a7b45e087183740b12faf3a",
"source": "type3",
},
{
"id_1": "abb87219db254d108a1e0f774f88dfb6",
"criteriaId": "b83b3f081a7b45e087183740b12faf3a",
"source": "type1",
}
]
},
{
"id": "fe5b071a2d8a4a9da61bbd81b9271e31",
"caption": "caption1",
"criteriaType": "type1",
"input": [
{
"id_1": "7ea1b85e4dbc44e8b37d1110b565a081",
"criteriaId": "fe5b071a2d8a4a9da61bbd81b9271e31",
"source": "type3",
},
{
"id_1": "c5f943b61f674265b8237bb560cbed03",
"criteriaId": "fe5b071a2d8a4a9da61bbd81b9271e31",
"source": "type3",
}
]
}];
function filterObj(obj, column, value){
var newArray = obj.filter(function (el) {
if(el[column]){
return el[column] == value;
}else{
for(var key in el.input){
if(typeof(el.input[key] == "object")){
var item = el.input[key];
if(item[column] == value){return item;}
}
}
}
});
return newArray;
}
console.log(filterObj(obj, 'caption','caption1'));
console.log(filterObj(obj, 'criteriaId','fe5b071a2d8a4a9da61bbd81b9271e31'));
console.log(filterObj(obj, 'id_1','1ecdf410b3314865be2b52ca9b4c8539'));
https://stackoverflow.com/questions/51528469
复制相似问题