我试图找到一种创建对象的方法,在创建对象时,它会忽略未定义的值。
在下面的示例中,变量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'
}发布于 2016-09-15 14:56:08
不要使用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
});发布于 2016-09-15 14:41:06
你可以做这样的事情来清理那些财产
Object.keys(animalNames).forEach(function (key) {
if(animalNames[key] === undefined) delete animalNames[key];
});发布于 2016-09-16 07:57:40
这就是我后来想要的。这只是@Bergi代码的一个重构。我这样做是因为它的循环次数减少了。@Bergi的答案允许尽可能多的对象参数。在此解决方案中,如果在babel (https://babeljs.io/docs/plugins/transform-object-rest-spread/)中启用了对象扩展,则只需使用this来创建第二个对象。
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!
https://stackoverflow.com/questions/39513815
复制相似问题