Как мне разобрать строку в число при деструктурировании?

Я пытаюсь поэкспериментировать с деструктурирующим заданием. Теперь у меня есть дело, которое я пытаюсь справиться с самоуничтожением.

Например, у меня есть такой ввод:

let input = {latitude: "17.0009", longitude: "82.2108"}

Где значения ключа latitude и longitude являются строками, но я хочу разобрать их в число при деструктуризации.

let input = {latitude: "17.0009", longitude: "82.2108"}
let {latitude,longitude} = input

console.log(typeof latitude,typeof longitude)

Ответ 1

Разрушение - это просто хороший способ распаковать свойства из объектов и массивов и назначить их переменным. Как видно из приведенного в этом документе кода, любая операция невозможна.

Одним из способов было бы создать еще 2 переменные (которых нет во input) и установить значение по умолчанию в числовом эквиваленте ранее уничтоженных свойств:

let input = { latitude: "17.0009", longitude: "82.2108" }
let { latitude, longitude, lat = +latitude, long = +longitude } = input

console.log(typeof latitude, typeof longitude, typeof lat, typeof long)

Ответ 2

Вы можете деструктурировать значения, взять массив значений и отобразить новый тип данных значения и присвоить эти значения переменным.

let input = { latitude: "17.0009", longitude: "82.2108" },
    { latitude, longitude} = input;

[latitude, longitude] = [latitude, longitude].map(Number);

console.log(typeof latitude, latitude);
console.log(typeof longitude, longitude);

Ответ 3

Хотя вы не можете выполнить преобразование типов в самом выражении деструктурирования, возможной альтернативой/обходным решением может быть деструктурирование свойств в аргументах функции, а затем возврат массива с новыми типами внутри него.

Например, что-то вроде следующего:

const input = {latitude: "17.0009", longitude: "82.2108"}
const [lat, lng] = (({latitude:a, longitude:b}) => [+a, +b])(input);

console.log(typeof lat, typeof lng); // number number

Ответ 4

Вы можете использовать функцию многократного использования, как показано ниже:

const numberInputs = input =>
    Object.keys(input).reduce((acc, val) => {
        acc[val] = +input[val];
        return acc;
    }, {});

и затем повторно использовать его через...

Затем сделайте:

let {latitude,longitude} = numberInputs(input);

console.log(typeof latitude,typeof longitude) //number //number

и получить 17.0009 и 82.2108 виде чисел...

Таким образом, вы также сохраняете свой оригинальный объект и делаете копию... так что у вас есть и оригинал, и копия объекта, у которого есть числа в качестве значений...

Ответ 5

Существует супер хакерский способ сделать это, используя String.prototype определенный в String.prototype в качестве вспомогательной функции.

(Вы, вероятно, не хотите этого делать)

Object.defineProperty (String.prototype, "asNumber",{
   get: function () { return +this}
});
let input = {latitude: "17.0009", longitude: "82.2108"}
let {latitude:{asNumber:latitude},
     longitude: {asNumber:longitude}} = input

console.log (latitude, longitude)

Ответ 6

Это невозможно - никакие операции не могут быть выполнены на объекте недвижимости во время деструктуры. Если вы используете деструктуризацию для извлечения свойства в переменную, эта переменная будет === к исходному значению свойства.

(конечно, вы можете преобразовать исходные значения объекта в Number до разрушения, но это не одно и то же)

Ответ 7

Я бы, вероятно, настроил все так, чтобы каждый "тип объекта", о котором я заботился, имел соответствующий "тип синтаксического анализатора": объект с такими же ключами, но значения которого являются соответствующими функциями синтаксического анализа для каждого члена.

Вот так:

"use strict";

var arr = {
    latitude: "17.0009",
    longitude: "82.2108"
};

function Parser(propParsers)
{
    this.propParsers = propParsers;
    this.parse = function (obj) {
        var result = {};
        var propParsers = this.propParsers;
        Object.keys(obj).forEach(function (k) {
            result[k] = propParsers[k](obj[k]);
        });
        return result;
    };
}

var parser = new Parser({
    latitude: Number,
    longitude: Number
});

let {latitude,longitude} = parser.parse(arr);
console.log(latitude);
console.log(longitude);