前言
项目中经常遇到对象浅层拷贝赋值的操作,如将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组成的对象和属性值了。
网友评论