工具类-处理数据函数

75 阅读2分钟

前提

在最新的项目中,需要与下位机(嵌入式)直接对接,他们需要的数据的数据类型基本都是int或者float类型。为了方便开发,准备写一个函数parse数据。

carbon (2).png ### 一、分析函数的需求 - 数据输入为`Object`或者`array` - 数据输出与源数据格式一致 - 对`非数字`异常处理 - 兼容不需要处理的值 ### 二、代码实现

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))


1676456624601.jpg

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
}

1676543218159.jpg