如何在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中的解决方案。