如何在JavaScript中有选择地定义/声明对象的键?

如何在JavaScript中有选择地定义/声明对象的键?,javascript,ecmascript-6,Javascript,Ecmascript 6,给定对象sas s = { a:1, b:2 } 我可以根据s的内容定义一个新对象t,该对象包含字段 比如说 t = { d: s.a ? 1 : 2 } t = { d: s.a ? 1 : undefined } t = s.a? { d: 1 } : {} 然后字段d的值取决于s.a(d的值取决于是否定义了s.a) 如何根据s的值排除对象中的字段,差不多 t = { d: s.a ? 1 : 2 } t = { d: s

给定对象
s
as

s = {
   a:1,
   b:2
}
我可以根据
s
的内容定义一个新对象
t
,该对象包含字段

比如说

t = {
   d: s.a ? 1 : 2
}
t = {
   d: s.a ? 1 : undefined
}
t = s.a? {
       d: 1 
    } : {}
然后字段
d
的值取决于s.a(d的值取决于是否定义了
s.a

如何根据s的值排除对象中的字段,差不多

t = {
   d: s.a ? 1 : 2
}
t = {
   d: s.a ? 1 : undefined
}
t = s.a? {
       d: 1 
    } : {}
但这不起作用

我知道这可以通过几个
if
else
来实现,但我正在寻找一个优雅的解决方案/oneliner

我的物体很大,所以我不想做类似的事情

t = {
   d: s.a ? 1 : 2
}
t = {
   d: s.a ? 1 : undefined
}
t = s.a? {
       d: 1 
    } : {}
编辑 我已经看到了各种各样的解决方案,我正在寻找一种单一/变化最小且可读的解决方案。类似于
惯用javascript
/
ecmascript 6

编辑 找到的副本似乎是针对javascript的,并且确实给出了这个问题的正确答案。我希望新的ecmascript可能对这个问题有一个更新的解决方案

试试这个:

let s = {
    a : 1
}

let data = {};
if(!!s.a) {
    data.a = s.a;
}

console.log(data);
var t = $.extend({}, {
    d: s.a ? 1 : undefined
});

您并没有真正说出要解决的问题,但通常有几种解决方案:

a生成
t
如果属性的值应该相等,这是很好的。由于属性名称不同,您需要将它们映射到:

const source = {
   a: 10,
   b: 12
}
const propertyNameMap = {
   a: "alpha",
   b: "beta"
}
const target = {};
for(let i in source) {
    if(source.hasOwnProperty(i) && propertyNameMap[i]) {
        target[propertyNameMap[i]] = source[i];
    }
}
属性吸气剂 如果属性需要唯一的转换,但相互依赖,则可以为
目标
对象定义一个getter。请注意,这具有明显的性能影响,并且实际上并不比静态生成值好多少,除非它们随时间变化:

// eg. if alpha maps to ASCII letter:
Object.defineProperty(target, "alpha", {
    get: function() {return String.fromCharCode(a.a);},
    enumerable: true
});

您可以使用
Object.assign()
,如果有
s.a
属性,它将添加新对象的属性,否则它不会做任何事情

var s={a:1,b:2}
var t={}
赋值(t,s.a?{d:1}:null)

console.log(t)
更新了我的问题:-)试着解释一下你的代码片段将如何解决这个问题..这和我在问题中指定的不一样吗?还是我遗漏了什么?你没有使用扩展方法。如果你使用它,它会工作。如果这是正确的,为什么它会消失在扩展?也许我误解了你的问题。我以为你只想拥有t变量中有值的属性。你做到了!,但我的问题更具理论性,为什么我需要使用extend将其移动到另一个对象,以便
未定义的
真正成为
未定义的
?老实说,我认为您应该将
未定义的
字段视为不存在,仅此一点就可以解决您的问题。@TomášZato在本例中,如果
s.a
未定义,则该字段不存在。我看不出您的问题所在。FWIW,JavaScript是ECMAScript的实现。提供ES6中的解决方案。