将一维数组中的filter()方法扩展到多维数组中,代码封装实现:
//拓展Array的deepFilter方法
//任意维数组过滤
(function (Array) {
if (Array.prototype.deepFilter)
return;
Object.defineProperty(Array.prototype, "deepFilter", {
//接收一个函数作为过滤器
value: function (fn) {
var result = [];
if (typeof fn != 'function')
return result;
for (var i = 0; i < this.length; i++) {
//若元素为数组,递归
if ($.isArray(this[i])) {
result.push(this[i].deepFilter(fn));
continue;
}
//过滤方法参数支持:元素,索引,数组本身
if (fn(this[i], i, this)) {
result.push(this[i]);
}
}
return result;
},
enumerable: false
});
})(Array);
调用方法:
//测试用例
var arr = [1, 2, 3, 4, 5, 6];
var res = arr.deepFilter((item, index) => item > 2 && index % 2);
console.log(res);//[4, 6]
var arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 3, name: 'Cat' }
];
var res = arr.deepFilter(item => item.id > 1 && item.name < 'C');
console.log(res);//[{id: 2, name: 'Bob'}]
var arr = [
[
{ name: 'Alice', age: 8 }
],
[
{ name: 'Tom', age: 2 },
{ name: 'Jerry', age: 5 }
]
];
var res = arr.deepFilter(item => item.age > 3);
console.log(res);//[[{"name":"Alice","age":8}],[{"name":"Jerry","age":5}]]