npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@konata9/milk-shake

v2.0.0

Published

a params serialization and deserialization tool

Downloads

2

Readme

Milk Shake

MIT license GitHub package.json version GitHub code size in bytes Codecov

使用 TypeScript 编写的用于格式化对象 key 的工具。2.x 版本不兼容 1.x 版本(1.x 版本已经弃用)1.x 版本地址

特点

  • 让对象的 key驼峰下划线自定义 形式间自由转换
  • 简单的 API 使用
  • 不会修改传入的数据
  • 类似 pipe 的调用方式,根据自身需求调用需要的规则与顺序

快速上手

1. 安装

查看 NPM

npm i @konata9/milk-shake
import {shake, format, map, melt} from "@konata9/milk-shake";
// or
const {shake, fromat, map, melt} = require("@konata9/milk-shake");

2. 使用

import {shake, format, map, melt} from "@konata9/milk-shake";

const userInfo = {
  user_name: "konata",
  age: 16,
  friend_list: [{friend_name: "hiragi kagami"}, {friend_name: "hiragi tsukasa"}]
};

const result = shake(userInfo)(format("toCamel"));

/**
 * formattedUserInfo:
 * {
 *  userName: 'konata',
 *  age: 16,
 *  friendList:[
 *    {friendName: 'hiragi kagami'},
 *    {friendName: 'hiragi tsukasa'},
 *  ]
 * }
 */

API

推荐在 TypeScript 环境下使用。

shake(params)(fromatters)

  • params: (required) object 需要处理的对象
  • formatters: function 用于处理数据的工具函数。formatters 的调用方式类似于管道,前一个 formatter 的结果会作为下一个 fromatter 的参数。因此只要满足返回的是一个对象的前提下,可以编写自定义的处理函数。本库提供了 formatmeltmap 三个方法。

自带 Formatters

自带的 Formatters 可以单独使用。

format(method, excludes)

返回格式化后的对象(会对嵌套对象进行处理)

  • method: (required) string | function

    • method 可以为 "toCamel" 和 "toSnake" 两种字符串,分别将 key 转换为驼峰或下划线的形式。

    • method 也可以为自定义的转换方法 functionfunction(key) key 传入 params 的 key,必须提供返回值。返回转换后的 key。

      // 在所有 `key` 前加上下划线:
      (key) => `_${key}`
  • exclude: (not required) array 不需要进行转换的 key 的数组。exclude 的对象其子元素也将被忽略。

// 单独使用 fromat 方法
const formatData = {
  user_name: "konata",
  user_age: 18
};
format("toCamel", ["user_age"])(formatData);
// { userName: 'konata', user_age: 18 }
melt([{target, rule}])

接收一个包含 targerule 的对象数组,返回格式化后的对象

  • target: (required) string 为需要移除或者扁平化的 key。当没有设置 rule 时,删除 target 对应的 key;设置 rule 时会根据 rule 进行处理。当有对象嵌套时,可以使用 . 的方法指定深层对象。如 a.b.c 对应 a:{b:{c:1}}

  • rule: (not required) function(data, params) => object 接收两个参数 dataparams,必须提供一个对象类型的返回值。

    • data: target 对应的值
    • params: 传入的 params
// 单独使用 melt 方法
const formatData = {
  user_name: "konata",
  user_age: 18
};
melt([{target: "user_age"}])(formatData);
// { userName: 'konata'}
map([{from, to, rule}])

接收一个包含 fromtorule 的对象数组,返回格式化后的对象

  • from: (required) string 为需要进行 mapingkey,对应传入 paramskey。当没有设置 rule 时,为 from => to 的简单映射;设置 rule 时会根据 rule 进行处理。当有对象嵌套时,可以使用 . 的方法指定深层对象。如 a.b.c 对应 a:{b:{c:1}}

  • to: (required) string 为需要进行 mappingkey,对应返回值中的 keyto 也支持 . 的方法用来设置嵌套对象,需要注意的是嵌套对象的父级必须存在且为对象

  • rule: (not required) function(data, params) => object 接收两个参数 dataparams

    • data: from 对应的值
    • params: 传入的 params
// 单独使用 map 方法
const formatData = {
  user_name: "konata",
  user_age: 18
};
map([{from: "user_name", to: "student_name"}])(formatData);
// { user_age: 18, student_name: 'konata' }
自定义 formatter

你可以根据实际需求,自定义 formatter。自定义的 formatter 需要满足下面的条件。

  • formatter 需要返回一个函数。返回的函数接受需要处理的对象,并且返回处理后的对象。
// 接收处理需要的参数
const customFormatter = formaOptions => {
  // 返回的函数接收需要处理的对象
  return params => {
    // ... 处理过程
    // 处理结束后返回处理过的对象
    return formattedParams;
  };
};

// 在 shake 中使用
shake(params)(
  customFormatter(opts),
  customFormatter(opts),
  customFormatter(opts),
  ...
)

完整的例子

// 驼峰化 + 移除不要属性 + mapping 数据
const formatData = {
  user_name: "konata",
  // 通过 exclude 设置不需要处理的 key
  user_age: 18,
  // 利用 melt 删除嵌套对象
  address_info: {
    province: "sh1",
    city: "sh2",
    area: "sh3"
  },
  // 利用 melt 进行扁平化
  contact_way: {
    telephone: 12345678901,
    mail_box: "[email protected]"
  },
  // 通过 map 编辑数据
  scores: [1, 2, 3, 4],
  // fromat 会对嵌套的 key 也做处理
  friend_list: [
    {friend_name: "1", friend_age: 10},
    {friend_name: "2", friend_age: 10},
    {friend_name: "3", friend_age: 10}
  ],
  // 通过 map 对嵌套数据进行处理
  courses: {
    chinese: {teacher: "a", age: 18},
    math: {teacher: "b", age: 18},
    english: {teacher: "c", age: 18}
  }
};

const formattedData = shake(formatData)(
  melt([
    {target: "address_info.province"},
    {
      target: "contact_way",
      rule: (data) => ({
        telephone: data.telephone,
        mail_box: data.mail_box
      })
    }
  ]),
  map([
    {from: "scores", to: "scores", rule: (data) => data.map((x) => x * x)},
    {from: "courses.chinese", to: "courses.chineseLesson"},
    {from: "courses.math", to: "courses.mathLesson"},
    {from: "courses.english", to: "courses.englishLesson"}
  ]),
  format("toCamel", ["user_age"])
);

/**
 *  {
 *     userName: 'konata',
 *     user_age: 18,
 *     addressInfo: { city: 'sh2', area: 'sh3' },
 *     scores: [ 1, 4, 9, 16 ],
 *     friendList:
 *      [ { friendName: '1', friendAge: 10 },
 *        { friendName: '2', friendAge: 10 },
 *        { friendName: '3', friendAge: 10 } ],
 *     courses:
 *      { chineseLesson: { teacher: 'a', age: 18 },
 *        mathLesson: { teacher: 'b', age: 18 },
 *        englishLesson: { teacher: 'c', age: 18 } },
 *     telephone: 12345678901,
 *     mailBox: '[email protected]'
 *  }
 *
 * /

注意点

  • 定义的 method 方法会处理深层嵌套的对象,包括数组型对象。如果不需要对嵌套数据进行处理,可以配置 exclude 或者 mapping

    // 嵌套的 key1_1、key2_2、key2_2_1 都会被处理
    obj:{
      key1:{key1_1: 'xxx'},
      key2:{
        key2_1:'xxx',
        key2_2:{
          key2_2_1:'xxx'
        }
      }
    }
    
    // 对 obj 数组中的每一项都会进行处理
    obj:[
      {key_1: 'xxx'},
      {key_2: 'xxx'},
    ]
  • meltmap 的相关使用场景

melt 适合扁平化和删除 keymap 适合数据的转换和整合,在一定程度上可以代替 format

测试

使用 jest 进行了单元测试。测试用例在 __test__ 文件夹下。

// 执行测试命令
npm run test