Server에 객체를 전송해야 할일도 있고,
Router에 queryString으로 넣을 때 객체로 넣을 수도 있고 해서.. 이런걸 만들어봤어요.
export function withoutEmptyString(value: string): boolean {
return value === "";
}
export function withoutZero(value: string | number): boolean {
return value === "0" || value === 0;
}
export function propertyDelete(object: object, ...removeModes: Array<Function>): object {
let clone = {...object};
Object.keys(clone).forEach( property => {
// @ts-ignore
let value = clone[property];
let needDelete = removeModes.some( removeMode => removeMode(value) );
if(needDelete) {
// @ts-ignore
delete clone[property];
}
});
return clone;
}
목적은 간단해요
객체 프로퍼티 순회하면서 지우고싶은 프로퍼티가 있으면 지워서 객체를 반환하려고 했어요.
지우고싶은 조건은 콜백함수로 만들어서 확장성을 고려한것 까지는 좋았으나..
과정에서 겪은 버그가 좀 있었어요.
(1) ==는 정말 지양해야 되겠더라구요.
0, "0" 둘 다 해당되려고
function에 return value == 0 했었는데
세상에 false == 0도 true로 되더라구요, 이건 몰랐어요.
그래서 false값이 저장된 프로퍼티도 다같이 지워지는 일이 발생했어요.
그래서 확실하게 return value === "0" || value === 0;
이렇게 고쳤어요...
(2) 매개변수를 건들지않기위해, 얕은 복사를 해야했어요.
propertyDelete(obj, withoutEmptyString);으로 호출하는 개발자의 의도를 생각해본다면,
매개로 넘어온 obj의 프로퍼티를 지우는게 아니라,
매개로 넘어온 obj를 복사한다음, 복사본에서 프로퍼티를 지우고 복사본을 반환하는게,
호출하는 개발자한테 직관적이더라구요.
제가만들고 제가 햇갈려서 잘못사용하여 버그를 냈습니다.
기타.. 중간에 {... 전개구문을 많이 이용한 이유도..
매개로 넘어온 객체 자체를 건들지 않으려고 했었어요.