今天我发现了array.filter()
方法及其关联的回调函数。
我有一系列看起来像这样的对象:
var treeAry = [
{"id" : "200", "parent": "#", "type" : "1"},
{"id" : "300", "parent": "#", "type" : "1"},
{"id" : "400", "parent": "#", "type" : "1"},
{"id" : "500", "parent": "300", "type" : "5"},
{"id" : "600", "parent": "300", "type" : "5"},
{"id" : "700", "parent": "400", "type" : "5"},
{"id" : "800", "parent": "400", "type" : "5"},
{"id" : "900", "parent": "200", "type" : "6"},
{"id" : "1000", "parent": "200", "type" : "9"},
{"id" : "1100", "parent": "200", "type" : "8"},
];
我能够成功过滤5:
filteredAry = [];
filteredAry = treeAry.filter(function(val, index, ary){
/*get all type 5*/
return val.type === '5';
/*get all type 5 or type 1*/
//return val.type === '1' || val.type === '5';
});
console.dir(filteredAry)
这是我的问题:
尽管我能够过滤5型,但我也需要5型的父母(孩子的parent
参考id
,并且parent
可以是#)。从本质上讲,我的结果应包括5型的任何内容,然后记录id 300
和400
。它不应包括id 200
。
我是否应该在filteredAry[]
上的每个循环中运行某种形式的循环以在treeAry[]
中找到并推动相应的项目?我不应该使用index
和ary
参数以某种方式获得父母吗?
对不起,我不知道该怎么做,并希望您的帮助。只需要朝正确的方向推动,谢谢!
尝试以下:
var treeAry = [
{"id" : "200", "parent": "#", "type" : "1"},
{"id" : "300", "parent": "#", "type" : "1"},
{"id" : "400", "parent": "#", "type" : "1"},
{"id" : "500", "parent": "300", "type" : "5"},
{"id" : "600", "parent": "300", "type" : "5"},
{"id" : "700", "parent": "400", "type" : "5"},
{"id" : "800", "parent": "400", "type" : "5"},
{"id" : "900", "parent": "200", "type" : "6"},
{"id" : "1000", "parent": "200", "type" : "9"},
{"id" : "1100", "parent": "200", "type" : "8"},
];
var result = treeAry.filter(value => {
return value.type === '5' || treeAry.filter(val => val.parent === value.id && val.type === '5').length > 0;
});
console.log(result)
如果ES6是问题,则可以用普通功能替换lambdas(箭头功能)。
一种方式是
var treeAry = [
{"id" : "200", "parent": "#", "type" : "1"},
{"id" : "300", "parent": "#", "type" : "1"},
{"id" : "400", "parent": "#", "type" : "1"},
{"id" : "500", "parent": "300", "type" : "5"},
{"id" : "600", "parent": "300", "type" : "5"},
{"id" : "700", "parent": "400", "type" : "5"},
{"id" : "800", "parent": "400", "type" : "5"},
{"id" : "900", "parent": "200", "type" : "6"},
{"id" : "1000", "parent": "200", "type" : "9"},
{"id" : "1100", "parent": "200", "type" : "8"},
];
filteredAry = [];
filteredAry = treeAry.filter(function(val, index, ary){
/*get all type 5*/
return val.type === '5' ||
ary.some(function(item){
return item.parent === val.id && item.type==='5';
});
});
console.dir(filteredAry)