是否有一种方法可以使用变量创建对象并忽略未定义的变量
Is there a way to create an object using variables and ignore undefined variables?
我试图找到一种创建对象的方法,在创建时忽略未定义的值。
在下面的例子中,变量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'}
相关文章:
- 如何在JavaScript中创建对象时使用变量的值
- 基于变量创建json对象id
- 当类型存储在变量中时,不使用eval创建对象的实例
- JavaScript:如何从变量中创建对象属性名称和值
- 从复选框创建具有复杂变量的对象
- Uncaught TypeError:使用变量创建对象时,undefined不是函数
- 从 2 个变量创建对象的缩写
- 如何创建名称为变量的对象
- 使用变量创建一个对象文字,如何只获取其值
- Fabric.js:只使用一个变量创建多个对象有问题吗
- 用java脚本创建一个带有数组变量的对象
- 用javascript重构变量以创建对象
- javascript为多个属性名称使用多个变量创建对象
- 使用ES6/7从具有与变量名称相同键的变量创建对象
- 将数组复制到“;这个“;变量(创建一个类似数组的对象)
- 从javascript对象方法中的变量创建新对象
- 如何从两个变量创建一个{key:value}对象
- 如何使用整型变量创建数组对象
- 是否有一种方法可以使用变量创建对象并忽略未定义的变量
- 通过推送变量创建对象数组