How to get a subset of a javascript object's properties

后端 未结 27 1685
刺人心
刺人心 2020-11-21 22:46

Say I have an object:

elmo = { 
  color: \'red\',
  annoying: true,
  height: \'unknown\',
  meta: { one: \'1\', two: \'2\'}
};

I want to m

相关标签:
27条回答
  • 2020-11-21 23:31

    You can use Lodash also.

    var subset = _.pick(elmo ,'color', 'height');
    

    Complementing, let's say you have an array of "elmo"s :

    elmos = [{ 
          color: 'red',
          annoying: true,
          height: 'unknown',
          meta: { one: '1', two: '2'}
        },{ 
          color: 'blue',
          annoying: true,
          height: 'known',
          meta: { one: '1', two: '2'}
        },{ 
          color: 'yellow',
          annoying: false,
          height: 'unknown',
          meta: { one: '1', two: '2'}
        }
    ];
    

    If you want the same behavior, using lodash, you would just:

    var subsets = _.map(elmos, function(elm) { return _.pick(elm, 'color', 'height'); });
    
    0 讨论(0)
  • 2020-11-21 23:33

    If you are using ES6 there is a very concise way to do this using destructuring. Destructuring allows you to easily add on to objects using a spread, but it also allows you to make subset objects in the same way.

    const object = {
      a: 'a',
      b: 'b',
      c: 'c',
      d: 'd',
    }
    
    // Remove "c" and "d" fields from original object:
    const {c, d, ...partialObject} = object;
    const subset = {c, d};
    
    console.log(partialObject) // => { a: 'a', b: 'b'}
    console.log(subset) // => { c: 'c', d: 'd'};
    
    0 讨论(0)
  • 2020-11-21 23:34

    Using the "with" statement with shorthand object literal syntax

    Nobody has demonstrated this method yet, probably because it's terrible and you shouldn't do it, but I feel like it has to be listed.

    var o = {a:1,b:2,c:3,d:4,e:4,f:5}
    with(o){
      var output =  {a,b,f}
    }
    console.log(output)

    Pro: You don't have to type the property names twice.

    Cons: The "with" statement is not recommended for many reasons.

    Conclusion: It works great, but don't use it.

    0 讨论(0)
  • 2020-11-21 23:34

    Note: though the original question asked was for javascript, it can be done jQuery by below solution

    you can extend jquery if you want here is the sample code for one slice:

    jQuery.extend({
      sliceMe: function(obj, str) {
          var returnJsonObj = null;
        $.each( obj, function(name, value){
            alert("name: "+name+", value: "+value);
            if(name==str){
                returnJsonObj = JSON.stringify("{"+name+":"+value+"}");
            }
    
        });
          return returnJsonObj;
      }
    });
    
    var elmo = { 
      color: 'red',
      annoying: true,
      height: 'unknown',
      meta: { one: '1', two: '2'}
    };
    
    
    var temp = $.sliceMe(elmo,"color");
    alert(JSON.stringify(temp));
    

    here is the fiddle for same: http://jsfiddle.net/w633z/

    0 讨论(0)
  • 2020-11-21 23:36

    There is nothing like that built-in to the core library, but you can use object destructuring to do it...

    const {color, height} = sourceObject;
    const newObject = {color, height};
    

    You could also write a utility function do it...

    const cloneAndPluck = function(sourceObject, keys) {
        const newObject = {};
        keys.forEach((obj, key) => { newObject[key] = sourceObject[key]; });
        return newObject;
    };
    
    const subset = cloneAndPluck(elmo, ["color", "height"]);
    

    Libraries such as Lodash also have _.pick().

    0 讨论(0)
  • 2020-11-21 23:37

    To add another esoteric way, this works aswell:

    var obj = {a: 1, b:2, c:3}
    var newobj = {a,c}=obj && {a,c}
    // {a: 1, c:3}
    

    but you have to write the prop names twice.

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