将对象s
指定为
s = {
a:1,
b:2
}
我可以使用字段定义新对象t
,具体取决于s
的内容,
说出类似
的内容t = {
d: s.a ? 1 : 2
}
然后字段d
值取决于s.a(d的值取决于是否定义s.a
)。
如何根据s的值排除对象中的字段? ,像
t = {
d: s.a ? 1 : undefined
}
虽然这不起作用......
我知道这可以通过几个if
else
完成,但我正在寻找一个优雅的解决方案/ oneliners
我的对象非常庞大,所以我不想做像
这样的事情t = s.a? {
d: 1
} : {}
修改
我已经看到了各种各样的解决方案,我正在寻找一个解决方案,它是一个oneliner /具有最小的变化并且是可读的。像idiomatic javascript
/ ecmascript 6
修改 找到的副本here似乎是针对javascript的,并确实给出了这个问题的正确答案。我希望新的ecmascript可能有更新的解决方案来解决这个问题
答案 0 :(得分:1)
试试这个:
var t = $.extend({}, {
d: s.a ? 1 : undefined
});
答案 1 :(得分:1)
您并没有真正说出您尝试解决的问题,但通常有几种解决方案:
t
a
如果属性的值相等,那么这很好。由于您的媒体资源名称不同,因此您需要映射它们:
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];
}
}
如果属性需要唯一转换但是依赖,则可以为target
对象定义getter。请注意,这具有明显的性能影响,并不比仅仅静态生成值更好,除非它们及时更改:
// eg. if alpha maps to ASCII letter:
Object.defineProperty(target, "alpha", {
get: function() {return String.fromCharCode(a.a);},
enumerable: true
});
答案 2 :(得分:0)
let s = {
a : 1
}
let data = {};
if(!!s.a) {
data.a = s.a;
}
console.log(data);
答案 3 :(得分:0)
您可以使用Object.assign()
,如果有s.a
属性,则会添加新对象的属性,否则将无法执行任何操作。
var s = {a:1,b:2}
var t = {}
Object.assign(t, s.a ? {d: 1} : null)
console.log(t)