解构任务中的道具可以转换到位吗?

时间:2018-03-03 18:58:39

标签: javascript syntax ecmascript-6 variable-assignment destructuring

这有效......

const { prop1:val1, prop2:val2 ) = req.query
val1 = val1.toLowerCase()

尽管如此,我更倾向于做一些像

这样的事情
const { prop1.toLowerCase():val1, prop2:val2 } = req.query

const { prop1:val1.toLowerCase(), prop2:val2 } = req.query

两者都不起作用。是否存在类似于此的语法或必须在破坏分配之外进行操作?

2 个答案:

答案 0 :(得分:3)

不,这是不可能的。解构赋值只分配,它不对值进行任意转换。 (Setter是一个例外,但它们只会使这一点复杂化。)

我建议写

const { prop1, prop2:val2 ) = req.query;
const val1 = prop1.toLowerCase();

或者,在一个声明中:

const { prop1, prop2:val2 ) = req.query, val1 = prop1.toLowerCase();

答案 1 :(得分:1)

临时变量解决方案的问题在于它们将相同数据的不同版本引入范围,这可能导致错误。

此解决方案创建一个实用程序函数,用于接收要解构的对象以及第二个对象,该对象是属性名称到转换函数的映射。它有点冗长,但却可以解决问题。



// Utility functions to perform specified transformations on an object
function transformProps(obj, trans) {
  return Object.assign({}, obj, ...Object.entries(trans).map(([prop, fn]) => 
    prop in obj ? {[prop]: fn(obj[prop])} : null
  ));
}

const { prop1:val1, prop2:val2 } = transformProps(
  {prop1: "FOO", prop2: "BAR"},
  {prop1: v => v.toLowerCase()} // Transformations to be made
);

console.log(val1, val2);