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

时间:2017-09-06 10:13:40

标签: javascript ecmascript-6

将对象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可能有更新的解决方案来解决这个问题

4 个答案:

答案 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)