只有在未定义某些键时,是否有办法在JavaScript中创建对象?
例如,假设我有一些需要有效负载的网络请求:
const payload = {
key1: 'value1',
key2: 'value2',
key3: 'value3'
};
现在,我们假设key2
和key3
是函数的可选参数。如果我没有传递它们,并且它们被保留为undefined
,则对象将成为:
const payload = {
key1: 'value1',
};
我在想,也许使用Object.create(...)可以帮助我解决这个问题?
有什么想法?感谢
答案 0 :(得分:2)
不确定我是否帮助你,但你需要这样的东西吗?
let payload = {
key1: 'value1',
key2: 'value2',
key3: null,
key4: undefined
};
let clearObject = function clearObject(obj) {
let newObj = {};
Object.keys(obj).forEach((key) => {
if (obj[key]) {
newObj[key] = obj[key];
}
});
return newObj;
};
console.log(clearObject(payload));
答案 1 :(得分:2)
您可以将array#reduce
与Object#key
一起使用。迭代每个键,只添加值不是null
或undefined
的键。
let payload = { key1: 'val1', key2: 'val2', key3: null, key4: undefined },
result = Object.keys(payload).reduce((r,k) => {
if(payload[k])
r[k] = payload[k];
return r;
},{});
console.log(result);

答案 2 :(得分:0)
当对象被序列化时,具有未定义值的键将被剥离(因为我们讨论的是网络数据包)。在此之前,对象中缺少的键存在占位符 。这可能是特定于实现的,不应该依赖。
var makePacket = function(value1, value2, value3) {
return { key1: value1, key2: value2, key3: value3 }
}
仅使用payload = makePacket('test')
中提供的value1调用此选项可以获得结果:
payload = {
key1: 'test',
key2: undefined,
key3: undefined
}
如果对象被序列化并通过网络传递,那么将没有关于缺失键的信息,它将只是:
payload = {
key1: 'test'
}
具有地点但未定义且根本不存在的值之间的差异略微具有学术性,因为您的处理代码应该同等地处理这两个条件。但请放心,如果你的串行器值得使用,你就不会在不存在的键上浪费带宽。