Как мне разобрать строку в число при деструктурировании?
Я пытаюсь поэкспериментировать с деструктурирующим заданием. Теперь у меня есть дело, которое я пытаюсь справиться с самоуничтожением.
Например, у меня есть такой ввод:
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);