数据过滤,只保留 json 里“中文 key”的数据

需求是只保留中文key的数据

{
    "list":[
        {
            "orderid":"123123123",
            "name":"无",
            "type":"优惠1",
            "优惠内容":"优惠1",
            "pay_price":"100",
            "支付金额":"100",
            "支付信息":"微信交易号:123123123"
        },
        {
            "orderid":"456456456",
            "name":"无",
            "type":"优惠2",
            "优惠内容":"优惠2",
            "pay_price":"100",
            "支付金额":"100",
            "支付信息":"微信交易号:123123123"
        }
    ]
}

这是我现在的代码,但是感觉非常繁杂

//从所有订单中 查找到套餐相对应的订单
let detail = [];
this.order_list.forEach((item) => { 
    if (item.orderid == orderid) {
        detail = item;
    }
})
//只保留中文字段
let detail2 = [];
Object.keys(detail).forEach(key=>{
    if (!this.regCn.test(key)) {
        detail2[key] = detail[key];
    }
})
this.order_detail_list = Object.keys(detail2).map(val => ({
  key: val,
  value: detail2[val]
}));

还望大佬们指点下,这段js可以优化吗?

阅读 5.3k
8 个回答

1、硬遍历

list.map(item => Object.keys(item).filter(key => /^[\u4e00-\u9fa5]+$/.test(key)).reduce((o, k) => {
    o[k] = item[k]
    return o
}, {}))

2、JSON.parse 或 JSON.stringify

list.map(item => JSON.parse(JSON.stringify(item), function(key, value){
    if(!key || /^[\u4e00-\u9fa5]+$/.test(key)){
        return value
    }
}))

试试用手机写答案,是个意思,跑不通的要自己改

//从所有订单中 查找到套餐相对应的订单
let detail = this.order_list
.find(e=>e.orderid==orderid)
.map((value,key)=>({key,value}))[0]
//只保留中文字段 
this.order_detail_list = {}
detail
.filter(e=>!this.regCn.test(e.key))
.reduce((pro,cur)=>({...pro,[cur.key]:cur.value}),this.oeder_detail_list)
list.reduce((a, c, i) => {
    a.push({})
    for (const [key, value] of Object.entries(c)) {
        new RegExp("[\u4E00-\u9FA5]+").test(key) && (a[i][key] = value)
    }
    return a
}, [])

从效率和代码可维护性来说,不建议用正则进行数据筛选处理。

  1. 要么让后端配合调整数据结构;
  2. 直接获取对应值,直接使用中文key;

原因为何,可以自己想一想。
个人建议方式1。

const formatById = (list, orderid) => {
  const detail = list.find(item => item.orderid === orderid)
  return Object.entries(detail)
    .map(([key, value]) => (!this.regCn.test(key) ? { key, value } : false))
    .filter(Boolean)
}

formatById(this.order_list, '123123123')
console.time()
console.log(data.list.map(item=>{
    return Object.fromEntries(Object.entries(item).reduce((acc,cur)=>{
        let [key] = cur;
        /^[\u4e00-\u9fa5]+$/.test(key) && acc.push(cur)
        return acc
    },[]))
},[]))
console.timeEnd();

image.png

我的想法是将key转ascii码 判断大小即可

function transform(arr) {
    var ret = [], reg = /^[\u4e00-\u9fa5]+$/;
    for (var i = 0; i < arr.length; ++i) {
        ret[i] = {};
        for (var key in arr[i]) {
            if (reg.test(key)) ret[i][key] = arr[i][key];
        }
    }
    return ret;
}
console.dir(transform(this.order_list));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题