基于键值动态创建对象(未定义)

时间:2018-01-24 17:23:29

标签: javascript

只有在未定义某些键时,是否有办法在JavaScript中创建对象?

例如,假设我有一些需要有效负载的网络请求:

const payload = {
    key1: 'value1',
    key2: 'value2',
    key3: 'value3'
};

现在,我们假设key2key3是函数的可选参数。如果我没有传递它们,并且它们被保留为undefined,则对象将成为:

const payload = {
    key1: 'value1',
};

我在想,也许使用Object.create(...)可以帮助我解决这个问题?

有什么想法?感谢

3 个答案:

答案 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#reduceObject#key一起使用。迭代每个键,只添加值不是nullundefined的键。



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'
}

具有地点但未定义且根本不存在的值之间的差异略微具有学术性,因为您的处理代码应该同等地处理这两个条件。但请放心,如果你的串行器值得使用,你就不会在不存在的键上浪费带宽。