Removing object properties with Lodash

后端 未结 8 1400
旧巷少年郎
旧巷少年郎 2021-02-02 05:30

I have to remove unwanted object properties that do not match my model. How can I achieve it with Lodash?

My model is:

var model = {
   fname: null,
   lna         


        
相关标签:
8条回答
  • 2021-02-02 05:41

    Get a list of properties from model using _.keys(), and use _.pick() to extract the properties from credentials to a new object:

    var model = {
       fname:null,
       lname:null
    };
    
    var credentials = {
        fname:"xyz",
        lname:"abc",
        age:23
    };
    
    var result = _.pick(credentials, _.keys(model));
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

    If you don't want to use Lodash, you can use Object.keys(), and Array.prototype.reduce():

    var model = {
       fname:null,
       lname:null
    };
    
    var credentials = {
        fname:"xyz",
        lname:"abc",
        age:23
    };
    
    var result = Object.keys(model).reduce(function(obj, key) {
      obj[key] = credentials[key];
      return obj;
    }, {});
    
    console.log(result);

    0 讨论(0)
  • 2021-02-02 05:42

    Lodash unset is suitable for removing a few unwanted keys.

    const myObj = {
        keyOne: "hello",
        keyTwo: "world"
    }
    
    unset(myObj, "keyTwo");
    
    console.log(myObj); /// myObj = { keyOne: "hello" }

    0 讨论(0)
  • 2021-02-02 05:43

    You can approach it from either an "allow list" or a "block list" way:

    // Block list
    // Remove the values you don't want
    var result = _.omit(credentials, ['age']);
    
    // Allow list
    // Only allow certain values
    var result = _.pick(credentials, ['fname', 'lname']);
    

    If it's reusable business logic, you can partial it out as well:

    // Partial out a "block list" version
    var clean = _.partial(_.omit, _, ['age']);
    
    // and later
    var result = clean(credentials);
    

    Note that Lodash 5 will drop support for omit

    A similar approach can be achieved without Lodash:

    const transform = (obj, predicate) => {
      return Object.keys(obj).reduce((memo, key) => {
        if(predicate(obj[key], key)) {
          memo[key] = obj[key]
        }
        return memo
      }, {})
    }
    
    const omit = (obj, items) => transform(obj, (value, key) => !items.includes(key))
    
    const pick = (obj, items) => transform(obj, (value, key) => items.includes(key))
    
    // Partials
    // Lazy clean
    const cleanL = (obj) => omit(obj, ['age'])
    
    // Guarded clean
    const cleanG = (obj) => pick(obj, ['fname', 'lname'])
    
    
    // "App"
    const credentials = {
        fname:"xyz",
        lname:"abc",
        age:23
    }
    
    const omitted = omit(credentials, ['age'])
    const picked = pick(credentials, ['age'])
    const cleanedL = cleanL(credentials)
    const cleanedG = cleanG(credentials)
    
    0 讨论(0)
  • 2021-02-02 05:45

    You can easily do this using _.pick:

    var model = {
      fname: null,
      lname: null
    };
    
    var credentials = {
      fname: 'abc',
      lname: 'xyz',
      age: 2
    };
    
    var result = _.pick(credentials, _.keys(model));
    
    
    console.log('result =', result);
    <script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

    But you can simply use pure JavaScript (specially if you use ECMAScript 6), like this:

    const model = {
      fname: null,
      lname: null
    };
    
    const credentials = {
      fname: 'abc',
      lname: 'xyz',
      age: 2
    };
    
    const newModel = {};
    
    Object.keys(model).forEach(key => newModel[key] = credentials[key]);
    
    console.log('newModel =', newModel);

    0 讨论(0)
  • 2021-02-02 05:45

    To select (or remove) object properties that satisfy a given condition deeply, you can use something like this:

    function pickByDeep(object, condition, arraysToo=false) {
      return _.transform(object, (acc, val, key) => {
        if (_.isPlainObject(val) || arraysToo && _.isArray(val)) {
          acc[key] = pickByDeep(val, condition, arraysToo);
        } else if (condition(val, key, object)) {
          acc[key] = val;
        }
      });
    }
    

    https://codepen.io/aercolino/pen/MWgjyjm

    0 讨论(0)
  • 2021-02-02 05:52

    Here I have used omit() for the respective 'key' which you want to remove... by using the Lodash library:

    var credentials = [{
            fname: "xyz",
            lname: "abc",
            age: 23
    }]
    
    let result = _.map(credentials, object => {
                           return _.omit(object, ['fname', 'lname'])
                       })
    
    console.log('result', result)
    
    0 讨论(0)
提交回复
热议问题