美文网首页
TS 封装BeanUtils 对象拷贝工具类

TS 封装BeanUtils 对象拷贝工具类

作者: 硅谷干货 | 来源:发表于2022-06-12 18:59 被阅读0次

前言

项目中经常遇到对象浅层拷贝赋值的操作,如将A的对象值赋值给B,但是不能又不能合并,因为传参的时候不需要多余的属性,所以这里我参考Java封装了一个TS工具类,方便大家使用。

实现

import { pick, omit } from "lodash-es";

// 从source中挑选target中的属性值
export const pickSourceWithTarget = <S extends object, T extends object>(
  source: S,
  target: T
) => {
  return pickProperties(source, Object.keys(target));
};

// 从source中排除target中的属性值
export const omitSourceWithTarget = <S extends object, T extends object>(
  source: S,
  target: T
) => {
  return omitProperties(source, Object.keys(target));
};

// 挑选对象属性值
export const pickProperties = <T extends object>(
  source: T,
  props: string[]
) => {
  return pick(source, props);
};

// 忽略对象属性值
export const omitProperties = <T extends object>(
  source: T,
  props: string[]
) => {
  return omit(source, props);
};

// 将source中的属性值拷贝给target
export const copyProperties = (source: any, target: any) => {
  Object.keys(target).forEach((key) => {
    target[key] = source[key];
  });
  return target;
};

// 解构赋值(TODO: )
export const resolveObj = (target: any) => {
  let { a, b, ...targetObj } = target;
  return targetObj;
};

测试

首先,创建如下两个对象objA 和objB

const objA = {
  a: 1,
  b: 2,
  c: 3
}

const objB = {
  a: 4,
  b: 5,
}

使用

const myObj = pickSourceWithTarget(objA, objB)
console.log(myObj)

打印: 
{
  a: 1,
  b: 2
}

const myObj2 = omitSourceWithTarget(objA, objB)
console.log(myObj2)

打印: 
{
  c: 3
}

OK! 这样就能根据B的属性,挑选A中a,b组成的对象和属性值了。

相关文章

网友评论

      本文标题:TS 封装BeanUtils 对象拷贝工具类

      本文链接:https://www.haomeiwen.com/subject/ykxnmrtx.html