Javascript 如何在没有未定义属性的情况下从另一个对象创建对象

Javascript 如何在没有未定义属性的情况下从另一个对象创建对象,javascript,Javascript,有没有更好的方法在Javascript中实现这一点 const data: any = {}; if (values.email) data.email = values.email; if (values.password) data.password = values.password; if (values.username) data.username = values.username; 我不希望数据对象具有未定义的或虚假值的属性。您可以将潜在属性放入一个数组中,然后输出任何值[pr

有没有更好的方法在Javascript中实现这一点

const data: any = {};
if (values.email) data.email = values.email;
if (values.password) data.password = values.password;
if (values.username) data.username = values.username;

我不希望
数据
对象具有
未定义的
或虚假值的属性。

您可以将潜在属性放入一个数组中,然后输出任何
值[prop]
具有fasly值的属性。然后,您可以将每个键添加到
[key,value]
对数组中,并使用来为您构建
数据
对象:

const值={
电子邮件:“abc”,
用户名:“xyz”
};
const props=[“电子邮件”、“密码”、“用户名”];
const data=Object.fromEntries(
props.filter(prop=>values[prop]).map(prop=>[prop,values[prop]]))
);

控制台日志(数据)您可以按照以下方式进行操作:

const obj1={
prop1:没错,
建议2:错误,
prop3:4,
}
const obj2=Object.entries(obj1).reduce((结果,[key,value])=>{
如果(值){
结果[键]=值
}
返回结果
}, {})

log(obj2)
如果您想要复制所有没有false-y值的属性,那么这个简单的函数就可以做到这一点。如果你只想要一个固定的列表,看看尼克·帕森斯的答案

const copynnonnil=(obj)=>
Object.fromEntries(Object.entries(obj.filter)([k,v])=>v))
常量值={
电邮:'foo@bar.baz',
用户名:“foobar”,
密码:“”,
另一个:错
}
console.log(copynnonnil(values))
您可以使用它来迭代
值的属性,并在其中执行真/假检查,以使其更灵活:

for(const [key, value] of Object.entries(values)){
    if(values[key]) data[key] = value;
}

这将只为任何大小的
对象提供
数据中的真实值。

我预计太多不支持
对象的环境。fromEntries
也不支持在对象初始值设定项中展开。在这种情况下,我会选择使用
reduce
的回退方法,就像在dude中的答案一样。@ScottSauyet第二个代码段应该与es6兼容,因为它使用扩展语法将参数扩展到赋值方法(而不是扩展到对象文字的es2018功能)。是的,我误读了。这应该在所有ES6环境中都得到支持。谢谢,我希望ES6中会有javascript函数。我想不是。