首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种使用变量创建对象而忽略未定义变量的方法?

是否有一种使用变量创建对象而忽略未定义变量的方法?
EN

Stack Overflow用户
提问于 2016-09-15 14:33:43
回答 5查看 10.7K关注 0票数 10

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

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

代码语言:javascript
复制
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'}

实际记录的内容如下:

代码语言:javascript
复制
{
  catName: 'purry',
  dogName: undefined,
  hamsterName: undefined,
  rabbitName: 'floppy'
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-09-15 14:56:08

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

代码语言:javascript
复制
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
});
票数 8
EN

Stack Overflow用户

发布于 2016-09-15 14:41:06

你可以做这样的事情来清理那些财产

代码语言:javascript
复制
Object.keys(animalNames).forEach(function (key) {
    if(animalNames[key] === undefined) delete animalNames[key];
});
票数 2
EN

Stack Overflow用户

发布于 2016-09-16 07:57:40

这就是我后来想要的。这只是@Bergi代码的一个重构。我这样做是因为它的循环次数减少了。@Bergi的答案允许尽可能多的对象参数。在此解决方案中,如果在babel (https://babeljs.io/docs/plugins/transform-object-rest-spread/)中启用了对象扩展,则只需使用this来创建第二个对象。

代码语言:javascript
复制
  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!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39513815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档