前提
在最新的项目中,需要与下位机(嵌入式)直接对接,他们需要的数据的数据类型基本都是int或者float类型。为了方便开发,准备写一个函数parse数据。
1.基本功能实现
const parseParamsInt( data , ignoreKey = [] ) => {
// ignoreKey 需要忽略的key值
let _new = {}
if((data ?? {}) == {}) return _new
for (let item in data){
_new[item] = ignoreKey.includes(item) || isNaN(Number(data[item])) ?
data[item] : Number(data[item])
}
return _new
}
let obj = {
"highEnergyC": "49.113",
"lowEnergyC": "101156",
"midEnergyC" : "中值"
}
console.log(parseParamsInt(obj,['highEnergyC']))
///
{
"highEnergyC": "49.113",
"lowEnergyC": 101156,
"midEnergyC" : "中值"
}
2.处理源数据格式
/// 处理源数据为多层对象
export function parseParamsInt(data,ignoreKey = []){
if((data ?? {}) === {}) return {}
for (let item in data){
if(Object.prototype.toString.call(data[item]) === "[object Object]"){
parseParamsInt(data[item],ignoreKey)
}else{
data[item] = ignoreKey.includes(item) || isNaN(Number(data[item])) ? data[item] : Number(data[item])
}
}
return data
}
处理源数据为数组的类型
export function parseParamsInt(data,ignoreKey = []){
if((data ?? {}) === {}) return {}
if(Object.prototype.toString.call(data) === "[object Array]"){
if(data.length === 0) return[]
data.map(item => {
parseParamsInt(item,ignoreKey)
})
}else{
for (let item in data){
if(Object.prototype.toString.call(data[item]) === "[object Object]"){
parseParamsInt(data[item],ignoreKey)
}else if (Object.prototype.toString.call(data[item]) === "[object Array]") {
if(data[item].length === 0) return[]
data[item].map((s) => {
parseParamsInt(s, ignoreKey)
})
}else{
data[item] = ignoreKey.includes(item) || isNaN(Number(data[item])) ? data[item] : Number(data[item])
}
}
}
return data
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
let source = [{ "gas": { "highEnergyAC": 0.8570958971977234, "isCalc": 1, "lowEnergyAC": 0.804279625415802 }, "oil": { "highEnergyAC": 0.8570958971977234, "isCalc": 1, "lowEnergyAC": [{ label:"hello", value:"this is my message", else:"3.1425" }]
}
}]
console.log(parseParamsInt(source))
3.功能拓展 -- 优化
- 数据初始化
- 数据处理回调函数
export function parseParamsInt(data,ignoreKey = [], fn){
if((data ?? {}) === {}) return {}
if(Object.prototype.toString.call(data) === "[object Array]"){
if(data.length === 0) return[]
data.map(item => {
parseParamsInt(item,ignoreKey,fn)
})
}else{
for (let item in data){
if(Object.prototype.toString.call(data[item]) === "[object Object]"){
parseParamsInt(data[item],ignoreKey,fn)
}else if (Object.prototype.toString.call(data[item]) === "[object Array]") {
if(data[item].length === 0) return[]
data[item].map((s) => {
parseParamsInt(s, ignoreKey,fn)
})
}else{
data[item] = ignoreKey.includes(item) || isNaN(Number(data[item])) ? data[item] : Number(data[item])
if ( fn && (typeof fn === 'function')) {
data[item] = fn(data[item], item)
}
}
}
}
return data
}
4.参数优化
按照上面的代码会改变原始数据的结构,这不是我们想要的返回结果,只需要进行一下深拷贝。
export function parseParamsInt(source,ignoreKey = [], fn){
let data = deepClone(source)
let parseParamsIntFn = (data,ignoreKey = [], fn) => {
if((data ?? {}) === {}) return {}
if(Object.prototype.toString.call(data) === "[object Array]"){
if(data.length === 0) return[]
data.map(item => {
parseParamsIntFn(item,ignoreKey,fn)
})
}else{
for (let item in data){
if(Object.prototype.toString.call(data[item]) === "[object Object]"){
parseParamsIntFn(data[item],ignoreKey,fn)
}else if (Object.prototype.toString.call(data[item]) === "[object Array]") {
if(data[item].length === 0) return[]
data[item].map((s) => {
parseParamsIntFn(s, ignoreKey,fn)
})
}else{
data[item] = ignoreKey.includes(item) || isNaN(Number(data[item])) ? data[item] : Number(data[item])
if ( fn && (typeof fn === 'function')) {
data[item] = fn(data[item], item)
}
}
}
}
return data
}
return parseParamsIntFn(data, ignoreKey , fn)
}
5.深拷贝优化
将let data = deepClone(source),将深拷贝的逻辑与赋值的逻辑进行融合
//判断数据类型
export const instansceObject = obj => {
if (obj instanceof Element) {
return 'element'
}
let _type = Object.prototype.toString.call(obj)
return _type.replace('[object ','').replace(']','')
}
export function parseParamsInt(data,ignoreKey = [], fn){
let target ;
if((data ?? {}) === {}) return {}
if(instansceObject(data) === "Array"){
if(data.length === 0) return[]
target = []
data.map(item => {
target.push(parseParamsInt(item,ignoreKey,fn))
})
}else{
target = {}
for (let item in data){
if(instansceObject(data[item]) === "Object"){
target[item] = parseParamsInt(data[item],ignoreKey,fn)
}else if (instansceObject(data[item]) === "Array") {
target[item] = []
if(data[item].length === 0) return[]
data[item].map((s) => {
target[item].push(parseParamsInt(s, ignoreKey,fn))
})
}else{
target[item] = ignoreKey.includes(item) || isNaN(Number(data[item])) ? data[item] : Number(data[item])
if ( fn && (typeof fn === 'function')) {
target[item] = fn(data[item], item)
}
}
}
}
return target
}