[removed] filter() for Objects

前端 未结 16 805
心在旅途
心在旅途 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:27

    How about:

    function filterObj(keys, obj) {
      const newObj = {};
      for (let key in obj) {
        if (keys.includes(key)) {
          newObj[key] = obj[key];
        }
      }
      return newObj;
    }
    

    Or...

    function filterObj(keys, obj) {
      const newObj = {};
      Object.keys(obj).forEach(key => {
        if (keys.includes(key)) {
          newObj[key] = obj[key];
        }
      });
      return newObj;
    }
    
    0 讨论(0)
  • 2020-11-22 15:29

    If you wish to mutate the same object rather than create a new one.

    The following example will delete all 0 or empty values:

    const sev = { a: 1, b: 0, c: 3 };
    const deleteKeysBy = (obj, predicate) =>
      Object.keys(obj)
        .forEach( (key) => {
          if (predicate(obj[key])) {
            delete(obj[key]);
          }
        });
    
    deleteKeysBy(sev, val => !val);
    
    0 讨论(0)
  • 2020-11-22 15:36

    Given

    object = {firstname: 'abd', lastname:'tm', age:16, school:'insat'};
    
    keys = ['firstname', 'age'];
    

    then :

    keys.reduce((result, key) => ({ ...result, [key]: object[key] }), {});
    // {firstname:'abd', age: 16}
    

    // Helper
    function filter(object, ...keys) {
      return keys.reduce((result, key) => ({ ...result, [key]: object[key] }), {});
      
    };
    
    //Example
    const person = {firstname: 'abd', lastname:'tm', age:16, school:'insat'};
    
    // Expected to pick only firstname and age keys
    console.log(
      filter(person, 'firstname', 'age')
    )

    0 讨论(0)
  • 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

    0 讨论(0)
  • 2020-11-22 15:38

    Plain ES6:

    var foo = {
        bar: "Yes"
    };
    
    const res = Object.keys(foo).filter(i => foo[i] === 'Yes')
    
    console.log(res)
    // ["bar"]
    
    0 讨论(0)
  • 2020-11-22 15:39

    As patrick already stated this is a bad idea, as it will almost certainly break any 3rd party code you could ever wish to use.

    All libraries like jquery or prototype will break if you extend Object.prototype, the reason being that lazy iteration over objects (without hasOwnProperty checks) will break since the functions you add will be part of the iteration.

    0 讨论(0)
提交回复
热议问题