ofliterjsJavascript 数据对象过滤处理库

联合创作 · 2023-09-22 01:27

在开发中经常需要组装数据向API提交,或者从API响应数据过滤显示,这时 ofliterjs 库能快速解决数据处理问题。

OfilterJs 是一个用于 Javascript 的数据对象{}过滤处理器,为开发提供更简单、便捷、高效的数据处理操作。

ofilter-js

相关连接

支持语言

  • Javascript
  • TypeScript

功能

  • 🍑 filterValue 过滤数据
  • 🍐 getValue 读取数据
  • 🍎 resetValue 重置数据

安装模块

$ npm i ofilterjs

或其他 pnpm、cnpm、yarn ...

$ pnpm i ofilterjs

引入模块

 import ofjs from 'ofilterjs'
 
 // const ofjs = require('ofilterjs')

一、数据过滤

filterValue([数据对象], [配置项], ...[扩展数据])

1.1 过滤/重组数据

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version_number: 10001
        }
    }
}

const newData = ofjs.filterValue(data, {
    name: 'lib.pkg.name',
    versionNumber: 'lib.pkg.version_number',
})
console.log(newData)

/** 结果
   newData = {
        name: 'ofilterjs',
        versionNumber: 10001
   } 
*/

1.2 直接指定值

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version_number: 10001
        }
    }
}

const newData = ofjs.filterValue(data, {
    name: 'lib.pkg.name',
    type: {
        value: 'type value'
    }
})
console.log(newData)

/** 结果
   newData = {
        name: 'ofilterjs',
        type: 'type value'
   } 
*/

1.3 设置默认值

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version_number: 10001
        }
    }
}

const newData = ofjs.filterValue(data, {
    name: 'lib.pkg.name',
    alias: {
        key: 'lib.pkg.alias',
        default: 'Default alias'
    },
    type: {
        key: 'lib.pkg.type',
        default: 'Npm pkg'
    }
})
console.log(newData)

/** 结果
   newData = {
        name: 'ofilterjs',
        alias: 'Default alias',
        type: 'Npm pkg'
   } 
*/

1.4 自定义过滤回调

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version_number: 10001
        }
    }
}

const newData = ofjs.filterValue(data, {
    name: 'lib.pkg.name',
    alias: {
        key: 'lib.pkg.alias',
        filter: (value, source) => {
            if (value !== '') return value
            return 'This is ' + (source?.lib?.pkg?.name || 'unknown')
        }
    },
    type: {
        key: 'lib.pkg.type',
        filter: (value, source) => {
            return 'Filter npm'
        }
    }
})
console.log(newData)

/** 结果
   newData = {
        name: 'ofilterjs',
        alias: 'This is ofilterjs',
        type: 'Filter npm'
   } 
*/

1.5 合并到结果集

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version_number: 10001
        }
    }
}

const newData = ofjs.filterValue(data, {
    name: 'lib.pkg.name',
    _: {
        merge: true,
        filter: (_, source) => {
            if (source?.lib?.pkg?.name === 'ofilterjs') {
                return {
                   support: ['js', 'ts', 'es']
                }
            }
            return {}
        }
    },
    _1: {
        merge: true,
        filter: (_, source) => {
            return { more: 'more data ...' }
        }
    },
  }
})
console.log(newData)

/** 结果
   newData = {
        name: 'ofilterjs',
        support: ['js', 'ts', 'es'],
        more: 'more data ...'
   } 
*/

1.6 合并扩展数据

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version_number: 10001
        }
    }
}

const newData = ofjs.filterValue(data, {
    name: 'lib.pkg.name'
  }
}, {
    name1: 'ofilter'
}, {
    name2: 'object filter'
})
console.log(newData)

/** 结果
   newData = {
        name: 'ofilterjs',
        name1: 'ofilter',
        name2: 'object filter'
   } 
*/

二、数据读取

getValue([名称访问字符串], [默认值])

2.1 值读取 / 深度读取

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            version: 10001
        },
        support: ['js', 'ts', 'es']
    }
}

// 原始方式
const name = data && data['lib'] && data['lib']['name'] && data['lib']['pkg']['name'] || 'unknown'
console.log(name)   // ofilterjs

// es6的 ?. 方式
const name = data?.lib?.pkg?.name || 'unknown'
console.log(name)   // ofilterjs

// 使用 ofilterjs 方式
const name = ofjs.getValue(data, 'lib.pkg.name', 'unknown')
console.log(name)   // ofilterjs

2.2 优先读取值

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version: 10001
        },
        support: ['js', 'ts', 'es']
    }
}

// 原始方式
const currnet = data && data['lib'] && data['lib']['pkg'] || {}
const alias = currnet['alias'] || currnet['name'] || 'unknown'
console.log(alias)   // ofilterjs

// es6的 ?. 方式
const alias = data?.lib?.pkg?.alias || data?.lib?.pkg?.name || 'unknown'
console.log(alias)   // ofilterjs

// 使用 ofilterjs 方式
const alias = ofjs.getValue(data, 'lib.pkg.alias|lib.pkg.name', 'unknown')
console.log(name)   // ofilterjs

2.3 数组索引下标读取

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version: 10001
        },
        support: ['js', 'ts', 'es']
    }
}

// 原始方式
const support = data && data['lib'] && data['lib']['support'] || {}
const su = support[0] || 'unknown'
console.log(su)   // js

// es6的 ?. 方式
const su = data?.lib?.support?.[0] || 'unknown'
console.log(su)   // js

// 使用 ofilterjs 方式
const su = ofjs.getValue(data, 'lib.support.0', 'unknown')
console.log(su)   // js

三、数据重置

resetValue([数据对象], [配置,可选])

Tip: 默认情况下属性名带有 '_' 前缀的将不会参与自动重置,但可以使用手动配置指定.

3.1 自动识别值类型重置值

浅重置(第一层有效)

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version: 10001
        },
        support: ['js', 'ts', 'es'],
        _private: 'private attr' 
    },
    lib2: {
        pkg: {}
    }
}

ofjs.resetValue(data, false)

/**  结果
const data = {
    lib: {},
    lib2: {}
}
*/

深重置(默认所有层有效)

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version: 10001
        },
        support: ['js', 'ts', 'es'],
        _private: 'private attr' 
    },
    lib2 : {
        pkg: {
            name: 'ofilter'
        }
    }
}

ofjs.resetValue(data, true)

/**  结果
const data = {
    lib: {
        pkg: {
            name: '',
            alias: '',
            version: 0
        },
        support: [],
        _private: 'private attr' 
    },
    lib2 : {
        pkg: {
            name: ''
        }
    }
}
*/

深重置 - 指定深度层数,不指定起始位置(默认从0开始)

const data = {
    // 0层
    name: 'lib_list',
    lib: {
        // 1层
        type: 'npm',
        pkg: {
            // 2层
            name: 'ofilterjs',
            alias: '',
            version: 10001
        },
        support: {
            'js' : 'javascript',
            'ts' : 'typescript'
        },
        _private: 'private attr' 
    },
    lib2 : {
        type: 'npm',
        pkg: {
            name: 'ofilter'
        }
    }
}

// 2代表深度为2个层数,表示:0 ~ (0+2),不包含(0+2)
ofjs.resetValue(data, true, 2)

/**  结果
const data = {
    // 0层
    name: '',   // 被重置
    lib: {
        // 1层
        type: '',   // 被重置
        pkg: {
            // 2层
            name: 'ofilterjs',
            alias: '',
            version: 10001
        },
        support: {
            'js' : 'javascript',
            'ts' : 'typescript'
        },
        _private: 'private attr' 
    },
    lib2 : {
        type: '',   // 被重置
        pkg: {
            name: 'ofilter'
        }
    }
}
*/

深重置 - 指定深度层数,也指定起始位置

const data = {
    // 0层
    name: 'lib_list',
    lib: {
        // 1层
        type: 'npm',
        pkg: {
            // 2层
            name: 'ofilterjs',
            alias: '',
            version: 10001,
            support: {
                 // 3层
                'js' : 'javascript',
                'ts' : 'typescript'
            }
        },
        _private: 'private attr' 
    },
    lib2 : {
        type: 'npm',
        pkg: {
            name: 'ofilter'
        }
    }
}

// 2代表深度为2个层数,表示:1 ~ (1+2),不包含(1+2)
ofjs.resetValue(data, true, 2, 1)

/**  结果
const data = {
    // 0层
    name: 'lib_list',
    lib: {
        // 1层
        type: '',   // 被重置
        pkg: {
            // 2层
            name: '',   // 被重置
            alias: '',  // 被重置
            version: 0, // 被重置
            support: {
                 // 3层
                'js' : 'javascript',
                'ts' : 'typescript'
            }
        },
        _private: 'private attr' 
    },
    lib2 : {
        type: '',   // 被重置
        pkg: {
            name: ''    // 被重置
        }
    }
}
*/

3.2 手动指定重置字段

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version: 10001
        },
        support: ['js', 'ts', 'es'],
        _private: 'private attr' 
    }
}

ofjs.resetValue(data, [
    'lib.pkg.name',
    'lib.pkg.version',
    'lib.pkg._private'
])

/**  结果
const data = {
    lib: {
        pkg: {
            name: '',
            alias: '',
            version: 0
        },
        support: ['js', 'ts', 'es'],
        _private: '' 
    }
}
*/

3.3 手动配置字段设置指定的值

const data = {
    lib: {
        pkg: {
            name: 'ofilterjs',
            alias: '',
            version: 10001
        },
        support: ['js', 'ts', 'es']
    }
}

ofjs.resetValue(data, {
    'lib.pkg.name': 'newname',
    'lib.pkg.version': 10002
})

/** 结果
const data = {
    lib: {
        pkg: {
            name: 'newname',
            alias: '',
            version: 10002
        },
        support: ['js', 'ts', 'es']
    }
}
*/
浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报