是否有一种方法可以使用变量创建对象并忽略未定义的变量

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

本文关键字:变量 创建对象 未定义 可以使 方法 一种 是否      更新时间:2023-09-26

我试图找到一种创建对象的方法,在创建时忽略未定义的值。

在下面的例子中,变量someNames在创建对象时具有未知的内容。

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'}

实际记录的内容是:

{
  catName: 'purry',
  dogName: undefined,
  hamsterName: undefined,
  rabbitName: 'floppy'
}

不要使用复制所有可枚举属性的Object.assign,而不考虑它们的值,而是使用您自己的自定义函数来过滤undefined属性:

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
});

老帖子,但是不太满意以前的答案。我想我应该凑钱找一个更干净的解决方案:

const someNames = {
  catName: 'purry',
  rabbitName: 'floppy',
  notAnAnimal: 'car',
};
const allowedKeys = ['catName', 'rabbitName'];
const animalNames = Object.keys(someNames).reduce((animals, key) => {
  if (allowedKeys.includes(key)) animals[key] = someNames[key];
  return animals;
}, {});

你可以这样做来清理这些属性

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

这是我后来做的。这只是@Bergi代码的重构。我这样做是因为循环次数减少了。@Bergi的答案允许尽可能多的对象参数。在此解决方案中,如果您在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);

谢谢@Bergi !

'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);

我认为你可以做到:

const someNames = {
  catName: 'purry',
  rabbitName: 'floppy',
  turtleName: 'shelly'
};
const { catName, dogName, hamsterName, rabbitName } = someNames;
const animalNames = Object.assign({}, Object.fromEntries(Object.entries({
  catName,
  dogName,
  hamsterName,
  rabbitName
}).filter(([key,value])=>value!==undefined)));
console.log(animalNames);// {catName: 'purry', rabbitName: 'floppy'}