该函数的介绍以及测试用例链接如下:
lodash.filter | Lodash中文文档 | Lodash中文网
版本一最原版(麻烦)的代码
function filter(array, predicate){
var result = []
//如果是字符串的话
if(typeof predicate == 'string'){
for(var item of array){
if(item[predicate]){
result.push(item)
}
}
}
//如果是对象的话
if(typeof predicate == 'object'){
for(var item of array){
for(var key in predicate){
if(!(predicate(key)==item[key])){
return false
}
}
return true
}
result.push(item)
}
if(Array.isArray(predicate)){
for(var item of array){
if(item[predicate[0]]===predicate[1]){
return result.push[item]
}
}
}
if(typeof predicate == 'function'){
for(var item of array){
if(predicate(item)){
return result.push(item)
}
}
}
}
版本二 将每种情况抽离成一个函数 这样就不用每次都做循环
function filter(array,predicate){
var func = predicate
if(typeof predicate == 'string'){
f = function(it){
return it[predicate]
}
}else if(Array.isArray(predicate)){
func = function(it){
return it[predicate[0]]===predicate[1]
}
} else if(typeof predicate =='object'){
func = function(it){
for(var key in predicate){
if((it[key]!==predicate[key])){
return false
}
}
return true
}
}
var result = []
for(var item of array){
if(func(item))
result.push(item)
}
return result
}
版本三--最终抽离出一个turnPredicateToFuntion函数 如果其他函数也有此情况的判断 可以直接引用
turnPredicateToFuntion:function (predicate){
var func = predicate
if(typeof predicate == 'string'){
f = function(it){
return it[predicate]
}
}else if(Array.isArray(predicate)){
func = function(it) {
return it[predicate[0]]===predicate[1]
}
}else if(typeof predicate =='object'){
func = function(it){
for(var key in predicate){
if((it[key]!==predicate[key])){
return false
}
}
return true
}
}
return func//返回一个func
}
filter实现:
filter:function(array,predicate){
func=turnPredicateToFuntion(predicate)
var result = []
for(var item of array){
if(func(item))
result.push(item)
}
return result
}