Javascript 仅当定义了名称时才向对象添加动态特性

Javascript 仅当定义了名称时才向对象添加动态特性,javascript,ecmascript-6,Javascript,Ecmascript 6,我有这样一个函数: const getKeysAs = (key1, key2) => { return { [key1]: state.key1, [key2]: state.key2 } } 因此,如果state.key1是'a',state.key2是'b',调用getKyesAs('one','two')将返回 { one: 'a', two: 'b' } 现在,如果其中一个参数是未定义的,是否有办法不将其包含在返回的对象

我有这样一个函数:

const getKeysAs = (key1, key2) => {
    return {
        [key1]: state.key1,
        [key2]: state.key2
    }
}
因此,如果state.key1是'a',state.key2是'b',调用
getKyesAs('one','two')
将返回

{
  one: 'a',
  two: 'b'
}
现在,如果其中一个参数是
未定义的
,是否有办法不将其包含在返回的对象中?

使用

使用


可以有条件地将属性添加到具有


如果某些args函数是
未定义的
空的
0
(错误值),则不会将其添加到对象中。

您可以有条件地使用


如果一些args函数是
未定义的
空的
0
(假值),则不会将其添加到对象中。

有一种非常可扩展的方法:

const state={
a:“你好”,
}
函数getKeysAs(键){
返回[…参数].reduce((acc,cur)=>{
const newValue=state[cur]&&{[cur]:state[cur]}
返回{…acc,…newValue}
}, {}) 
}

log(getKeysAs(“a”,“b”))
有一种非常可扩展的方法:

const state={
a:“你好”,
}
函数getKeysAs(键){
返回[…参数].reduce((acc,cur)=>{
const newValue=state[cur]&&{[cur]:state[cur]}
返回{…acc,…newValue}
}, {}) 
}

console.log(getKeysAs(“a”、“b”)
假设您实际上打算执行
状态[key1]
,而不是
状态.key1
,下面是一个不会创建多余对象的解决方案:

const getKeysAs = (...keys) => {
  const result = {};
  for (const key of keys) {
    if (key != null) {
      result[key] = state[key];
    }
  }
  return result;
}

假设您实际上打算执行
state[key1]
,而不是
state.key1
,下面是一个不会创建多余对象的解决方案:

const getKeysAs = (...keys) => {
  const result = {};
  for (const key of keys) {
    if (key != null) {
      result[key] = state[key];
    }
  }
  return result;
}

const o={};如果(键1)o[key1]=状态[key1]
常量o={};如果(键1)o[key1]=…?你的意思是说
状态[key1]
?对象解构指的是从对象中获取值。你在做相反的事。这种语法称为对象扩展。对象分解指的是从对象中获取值。你在做相反的事。这种语法称为对象扩展。假设OP实际上意味着执行
state[key1]
,而不是他们示例中的
state.key1
。是的。我建议他保持一贯的状态。这将使代码更容易理解和扩展。我同意你的意思,如果你的意思是状态应该是一个数组,而不是一个对象。但是如果你不是这个意思,那么state[key1]和state.key1都是一样的,对吗@donedeal0在我的示例中,状态仍然是一个对象。state[value]表示state.nameOfMyDynamicValue,state.value表示state.value。所以,通过state[cur],实际上可以获取state.nameOfCurrentKey。arguments是从函数中获取所有参数的本机方法,它不常用,所以看起来很花哨。这里的参数是[“a”,“b”]。因此,首先减少round=>“a”:state.a,然后是“b”:state.b。假设OP实际上意味着执行
state[key1]
,而不是他们示例中的
state.key1
。是的。我建议他保持一贯的状态。这将使代码更容易理解和扩展。我同意你的意思,如果你的意思是状态应该是一个数组,而不是一个对象。但是如果你不是这个意思,那么state[key1]和state.key1都是一样的,对吗@donedeal0在我的示例中,状态仍然是一个对象。state[value]表示state.nameOfMyDynamicValue,state.value表示state.value。所以,通过state[cur],实际上可以获取state.nameOfCurrentKey。arguments是从函数中获取所有参数的本机方法,它不常用,所以看起来很花哨。这里的参数是[“a”,“b”]。所以首先减少轮数=>“a”:state.a,然后是“b”:state.b。
const getKeysAs = (...keys) => {
  const result = {};
  for (const key of keys) {
    if (key != null) {
      result[key] = state[key];
    }
  }
  return result;
}