Is there a way to create an object using variables and ignore undefined variables?

I am trying to find a way to create an object where, when created, it ignores undefined values.

In the example below, the variable someNames has unknown content when creating the object.

const someNames = {
  catName: 'purry',
  rabbitName: 'floppy',
  turtleName: 'shelly'
};

const { catName, dogName, hamsterName, rabbitName } = someNames;

const animalNames = Object.assign({}, {
  catName,
  dogName,
  hamsterName,
  rabbitName
});

console.log(animalNames);// {catName: 'purry', rabbitName: 'floppy'}

What is actually logged is:

{
  catName: 'purry',
  dogName: undefined,
  hamsterName: undefined,
  rabbitName: 'floppy'
}
+4
source share
4 answers

Do not use Object.assignthat copies all of your own enumerated properties, regardless of their value, but your own custom function that can filter undefinedproperties:

function assignDefined(target, ...sources) {
    for (const source of sources) {
        for (const key of Object.keys(source)) {
            const val = source[key];
            if (val !== undefined) {
                target[key] = val;
            }
        }
    }
    return target;
}

const animalNames = assignDefined({}, {
  catName,
  dogName,
  hamsterName,
  rabbitName
});
+4
source

You can do something similar to clear these properties.

Object.keys(animalNames).forEach(function (key) {
    if(animalNames[key] === undefined) delete animalNames[key];
});
+1

'use strict';

const someNames = {
  catName: 'purry',
  rabbitName: 'floppy'
};

const expectedProperties = ['catName', 'dogName', 'hamsterName', 'rabbitName'];
const animalNames = Object.assign({}, expectedProperties.reduce((o, prop) => (someNames[prop]) ? (o[prop] = someNames[prop]) && o : o, {}));

console.log(animalNames);
Hide result
+1

Here is what I went after. This is just a @Bergi code refactor. I did it like this because it has a reduced number of cycles. @Bergi's answer allows as many object parameters as possible. In this solution, you can simply use spreads to create a second object if you have the distribution of objects in babel ( https://babeljs.io/docs/plugins/transform-object-rest-spread/ ).

  const someNames = {
    catName: 'purry',
    rabbitName: 'floppy',
    turtleName: 'shelly'
  };

  function assignDefined(target, source) {

    Object.keys(source).map((key, index) => {
      if(source[key] !== undefined) {
        target[key] = source[key];
      }
    });

    return target;
  }

  const { catName, dogName, hamsterName, rabbitName } = someNames;
  const animalNames = assignDefined({}, {
    catName,
    dogName,
    hamsterName,
    rabbitName
  });

  console.log(animalNames);

Thanks @Bergi

+1
source

Source: https://habr.com/ru/post/1654709/


All Articles