解构赋值构造一个新对象 - 有可能吗?

问题描述:

是否有可能使用解构赋值语法来将数据对象提取到另一个对象而不是不同的变量中?解构赋值构造一个新对象 - 有可能吗?

实施例,其产生不同的变量(FOO,巴):

var {p: foo, q: bar} = {p: 42, q: true}; 
 
    
 
console.log(foo); // 42 
 
console.log(bar); // true

我需要在代替创建一个包含下列属性作为新的对象:

var n = { 
foo: 42, 
bar: true 
} 
+0

@torazaburo这话题是,来到我的脑海里的第一件事。但是我没有把它标记为一个骗局,因为它不是一个愚蠢的问题。只有相关。答案只是部分相交。这个问题是关于默认值 - 尽管标题说什么。 – estus

这是不可能的。术语解构意味着对象是解构变量

的一种方式,以不与临时变量污染的范围是使用IIFE的解构:

obj = (({ foo = 'foo', bar = 'bar' }) => ({ foo, bar }))(obj); 

这将分配的默认值,并会选择从对象唯一有效的密钥。

如果采摘是没有必要的,最干净的配方与原生JS功能做到这一点Object.assign

obj = Object.assign({ foo: 'foo', bar: 'bar' }, obj); 

它有点像,但你需要两个步骤。你不能直接从一个对象解构到另一个对象中,但是你可以通过使用ES6对象表示法并将其包装到一个函数中来实现这一点。

function transformObject(object) { 
    const { p: foo, q: bar } = object; 
    const newObject = { 
    foo, 
    bar 
    }; 
    return newObject; 
} 

你不能用解构做到这一点,但你可以使用一个辅助功能是这样的:

function retag(newStructure, source) { 
 
    var result = {}; 
 
    for (var key in newStructure) { 
 
    result[key] = source[newStructure[key]]; 
 
    } 
 
    return result; 
 
} 
 

 
console.log(retag(
 
    { foo: 'a', bar: 'b' }, 
 
    { a: false, b: 42, c: 'unused'} 
 
));