【问题标题】:Destructuring object with a converter [duplicate]使用转换器解构对象[重复]
【发布时间】:2020-01-30 00:09:24
【问题描述】:

说,我有一个对象

const range = { min: '10', max: '20' }

我想对其进行解构,以便之后我有 2 个变量:
- min 的值为 10(不是 string '10'),并且
- max 的值为20

const { min, max } = range 只会导致min 的值为'10'(而不是10)。我想要的是Number(10)

我怎么能这样做?我确实对 ES6 解构有所了解,并进行了一些研究,尝试了不同的语法,但找不到满意的解决方案。谁能推荐一个?

结论:下面的答案中有非常巧妙的语法,但对于真正的代码,我会选择更冗长但可读的:

const min = +range.min // or Number(range.min)
const max = -range.max // or Number(range.max)

【问题讨论】:

  • 不确定是否可以对其应用函数,解构只是将对象/数组分配给一系列变量

标签: javascript object ecmascript-6 destructuring


【解决方案1】:

一种方法是使用+min+max 作为默认值的两个额外变量,

const range = { min: '10', max: '20' }

const {min, max, numMin = +min, numMax = +max} = range

console.log(numMin, numMax)

注意:- 在上述方法中,请确保使用对象中不可用的额外变量的名称,否则它不会使用默认值


另一种方法是使用IIFE,在解构之前将对象值转换为数值

const range = { min: '10', max: '20' }

const {min,max} = ( ({min,max}) => ( {min: +min, max: +max} ) )(range)

console.log(min,max)

在实际目的或实际代码中,我不会使用这种棘手的方式,因为我更喜欢可读性并且它有它自己的好处

const range = {
  min: '10',
  max: '20'
}

const min = parseInt(range.min)
const max = parseInt(range.max)

console.log(max, min)

【讨论】:

  • 我喜欢第二个
  • 我喜欢第一个~
  • 在实际使用中我不会使用任何一个,我将简单地定义两个变量并将值解析为数字,即const min = parseInt(obj.min)
  • @CodeManiac 但这就是我要做的。我期望一些语法很简单,比如const { min, max }:Number = rangeconst Number{ min, max } = range。除非,我只会定义 2 个变量。
【解决方案2】:

我认为您不能将任何转换作为解构操作的一部分,但您可以尝试先进行转换。

如果你有这样的功能:

function parseKeys(obj) {
    const parsed = {};
    for (const key of Object.keys(obj)) {
        try {
            parsed[key] = parseInt(obj[key]);
        } catch () {}
    }

    return { ...obj, ...parsed };
}

那么你可以有一个这样的单行:

const { min, max } = parseKeys(range);

【讨论】:

    【解决方案3】:

    您可以将解构后的值放入数组中,然后再次解构映射的值。

    var range = { min: '10', max: '20' },
        { min, max } = range;        
    
    [min, max] = [min, max].map(Number);
    
    console.log(typeof min, min);
    console.log(typeof max, max);

    【讨论】:

    • 谢谢,我很喜欢这个,但为了更好的可读性,我最终会在我的代码中使用const min = Number(range.min); const max = Number(range.max);
    猜你喜欢
    • 2013-03-20
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2021-01-17
    • 2018-07-19
    • 2019-04-07
    相关资源
    最近更新 更多