[removed] filter() for Objects

前端 未结 16 959
心在旅途
心在旅途 2020-11-22 15:23

ECMAScript 5 has the filter() prototype for Array types, but not Object types, if I understand correctly.

How would I implemen

16条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 15:36

    My opinionated solution:

    function objFilter(obj, filter, nonstrict){
      r = {}
      if (!filter) return {}
      if (typeof filter == 'string') return {[filter]: obj[filter]}
      for (p in obj) {
        if (typeof filter == 'object' &&  nonstrict && obj[p] ==  filter[p]) r[p] = obj[p]
        else if (typeof filter == 'object' && !nonstrict && obj[p] === filter[p]) r[p] = obj[p]
        else if (typeof filter == 'function'){ if (filter(obj[p],p,obj)) r[p] = obj[p]}
        else if (filter.length && filter.includes(p)) r[p] = obj[p]
      }
      return r
    }
    

    Test cases:

    obj = {a:1, b:2, c:3}
    
    objFilter(obj, 'a') // returns: {a: 1}
    objFilter(obj, ['a','b']) // returns: {a: 1, b: 2}
    objFilter(obj, {a:1}) // returns: {a: 1}
    objFilter(obj, {'a':'1'}, true) // returns: {a: 1}
    objFilter(obj, (v,k,o) => v%2===1) // returns: {a: 1, c: 3}
    

    https://gist.github.com/bernardoadc/872d5a174108823159d845cc5baba337

提交回复
热议问题