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

问题描述 投票:4回答:2

这有效......

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

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

javascript syntax ecmascript-6 variable-assignment destructuring
2个回答
3
投票

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

我建议写

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

或者,在一份声明中:

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

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);
© www.soinside.com 2019 - 2024. All rights reserved.