functional-flattener v1.2.1
๐ช functional-flattener
Modify JS object functionally and precisely
Install
Install from the NPM repository using yarn or npm:
npm i functional-flattener
yarn add functional-flattener
About
fucntional-flattener
๋ JS์ Array
๊ฐ map
, filter
๋ฑ์ Array.prototype
๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์์ ๋ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ์๋ฆฌ๋ก, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํตํด JS Object
๋ฅผ ์์ ํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. JS Object
๋ฅผ ๊ฐ๋ฐ์์ ์๋์ ๋ง๊ฒ ์์ ํ ์ ์๋๋ก ํ๋ ๋ช ๊ฐ์ง์ ๋ฉ์๋๋ค๊ณผ, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ์๊ฐ์ ๋ฐ์ ๋ฉ์๋ ์ฒด์ด๋์ ์ง์ํฉ๋๋ค.
Pros
1. Effective Data Adapting
Casing
- ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฑ์ ๊ตฌํ ์ธ์ด๊ฐ ๋ค๋ฅธ๋ฐ ์๋ฒ์์ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง ์์ ๊ฒฝ์ฐ์ HTTP์์ฒญ์ ํด์ ๋ฐ์ JSON ๊ฐ์ฒด์ key๊ฐ์ด JS์์ ์ฃผ๋ก ์ฌ์ฉํ๋ ์นด๋ฉ์ผ์ด์ค๊ฐ ์๋ ๋ค๋ฅธ ์ผ์ด์ค์ผ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค(Django์ ๊ฒฝ์ฐ๋ ์ค๋ค์ดํฌ ์ผ์ด์ค)
- Node๊ธฐ๋ฐ ํด๋ผ์ด์ธํธ์์ ESLint๋ฅผ ์ ์ฉ์ค์ด๋ผ๋ฉด, ์นด๋ฉ์ผ์ด์ค๊ฐ ์๋ ๋ค๋ฅธ ์ผ์ด์ค์ ํค๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ ๋ง์ผ๋ก๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ JSON ๊ฐ์ฒด์ ํค๋ฅผ ์ผ๊ด์ ์ผ๋ก ์ผ์ด์ฑํ ์ ์๋ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค.
functional-flattener
๋ ๊ฐ์ฒด์ ๋ชจ๋key
๋ฅผ ์ผ๊ด์ ์ผ๋ก ์นด๋ฉ, ์ค๋ค์ดํฌ ์ผ์ด์ค๋ก casingํ๋ ๋ฉ์๋๋ฅผ ์ง์ํฉ๋๋ค.
Data Adapting(flattening)
- HTTP ์์ฒญ์ ํตํด JSON ๊ฐ์ฒด๋ฅผ ๋ฐ์์ ๋ ํด๋น ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์ธํธ ์ฑ์์ ์ฐ๊ธฐ ์ข๋๋ก ์์ ์ ํด์ผํ๋ ์ํฉ์ด ์์ต๋๋ค.
- TravelFlan FEํ์์๋ ์ด๋ ๊ฒ ์๋ฒ๋ก๋ถํฐ ์๋ต๋ฐ์ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์ธํธ์
use-case
์ ๋ง๊ฒ ์์ ํ๋ ์์ํจ์๋ฅผflattener
๋ผ๊ณ ๋ช ๋ช ํ๊ณ , ๊ด์ต์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. functional-flattener
๋ ์์์ ์ธ๊ธํ ์ผ๊ด์ ์ธ ์ผ์ด์ฑ๋ฟ๋ง ์๋๋ผ ๊ฐ์ฒด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์์ ํ ์ ์๋ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ฉฐ, ๋ฉ์๋ ์ฒด์ด๋์ ํตํด ๊ฐ์ฒด๊ฐ ์์ ๋๋ ๊ณผ์ ๋ค์ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉํ ์ ์๊ฒ ํ์ต๋๋ค.
2. Economic Typing
const mockData = {
userId: 12424,
userName: 'max',
userAge: 25,
userProfile: {
userProfileText: 'I Love Zebra',
userFavoriteAnimal: { id: 3, animalName: 'vulture' },
userFriends: [
{ id: 12324, name: 'julie', favoriteAnimal: { id: 0, animalName: 'tiger' } },
{ id: 11424, name: 'michael', favoriteAnimal: { id: 1, animalName: 'lion' } },
{ id: 18924, name: 'shawn', favoriteAnimal: { id: 2, animalName: 'monkey' } },
],
},
}
function flattener(data) {
const { userId, userName, userAge, userProfile } = data
const processedUserName = `Hi! I am ${userName}`
const processedUserProfile = {
...userProfile,
userFriends: userProfile.userFriends.map((friend) => {
...friend,
name: `I am your friend name ${friend.name}.`
})
}
return {
userId,
userName : processedUserName,
userAge,
userProfile: processedUserProfile
}
}
- ๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ผ์ผํ ํ์ดํค์ณ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฆฌํดํ๋ ์์
imperative flattener
์ ๋ก์ง์ ์ฅํฉํ๊ณ , ๊ฐ๋ ์ฑ์๋ ์ข์ง ์์ต๋๋ค. - ์ํฉ์ ๋ฐ๋ผ ์ ์ฒ๋ฆฌ๊ฐ ํ์ ์๋ ๊ฐ์ฒด์ ํค์ ํ๋กํผํฐ๋ฅผ ํ์ดํํ ์๋ ์๊ณ , ํ์ดํํด์ผํ ๋ณ์๋ ๋์ด๋ ์ ์์ต๋๋ค.
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ฉ์๋ ์ฒด์ด๋์ ์ ์ฉํ๋ฉด ๊ฐ์ฒด ์ ์ฒด๋ฅผ ํ์ดํค์น ํ์ ์์ด ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ํ๋กํผํฐ์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
API(v1.0.0~)
1. FlattenTarget Class
- flattening์ ํ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ํด๋์ค์ ๋๋ค.
- ๋ฉค๋ฒ๋ณ์๋ก ์ธ์คํด์ค ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๊ณตํด์ผ ํ๋
Target Object
๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. - ์ด ํด๋์ค์ ๋ชจ๋ ๋ฉ์๋๋ค์ ์์ํ๊ฒ ์๋ก์ด FlattenTarget ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์, ๋ฉ์๋ ์ฒด์ด๋์ด ๊ฐ๋ฅํฉ๋๋ค.
returnResult()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ๋ง ์ผ๋ฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
2. flattener()
flattener({
userId: 12424,
userName: 'max',
userAge: 25,
})//...๋ค๋ฅธ ๋ฉ์๋๋ค์ ์ฒด์ด๋ํฉ๋๋ค.
- FlattenTarget ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ฆฌํดํ๋ ํฉํ ๋ฆฌ ํจ์์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ํ์์ ์์์ ์ด ๋๋ ํจ์์ ๋๋ค.
- FlattenTarget ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก FlattenTarget ํด๋์ค์ ๋ฉ์๋๋ค์ ์ฒด์ด๋ํ ์ ์์ต๋๋ค.
- ์ธ์๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ๋ฐ์ต๋๋ค.
3. case()
const result = flattener({
user_id: 12424,
user_name: 'Max',
user_age: 25,
// casingOption์ camel๊ณผ snake๋ฅผ ์ง์ํฉ๋๋ค.
}).case({to:'camel'}).returnResult()
// Result will be { userId: 12424, userName: 'Max', userAge: 25 }
- case ๋ฉ์๋๋ target ๊ฐ์ฒด์ key๋ฅผ ์ผ๊ด์ ์ผ๋ก ์ผ์ด์ฑํ๋ ๋ฉ์๋์ ๋๋ค.
- ์ธ์๋ก casingOption ๊ฐ์ฒด๋ฅผ ๋ฐ์ต๋๋ค. ๊ฐ์ฒด์ to ํ๋กํผํฐ๋ก 'camel' ํน์ 'snake' ์ต์ ์ ์ฃผ์ด ๊ฐ์ฒด์ ๋ชจ๋ ํค์ ์ผ์ด์ฑ์ ์ผ๊ด์ ์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
- ์ด๋ฏธ ๊ฐ์ฒด์ key๊ฐ casingOption์์ ๋ช ์๋ ์ผ์ด์ฑ์ด๋ผ๋ฉด, ํด๋น key๋ฅผ ๋ฌด์ํฉ๋๋ค.
4. changeKey()
const result = flattener({
userId: 12424,
userName: 'Max',
userAge: 25,
userProfile: {
userIntroduce: 'Hi! My name is Max',
userFavoriteAnimal: 'zebra',
}
// changeKeyPlan์ key๋ ๊ธฐ์กด target์ key, value๋ ์๋ก์ด key์
๋๋ค.
// ๊ฐ์ฒด ํ๋กํผํฐ์ key๋ฅผ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐ, ':'์ ์ด์ฉํฉ๋๋ค.
}).changeKey({
userAge:'userCurrentName',
'userProfile:userInfo': {
userFavoriteAnimal: 'userAnimal'
}
}).returnResult()
/*
Result will be
{
userId: 12424,
userName: 'Max',
userCurrentAge: 25,
userInfo: {
userIntroduce: 'Hi! My name is Max',
userAnimal: 'zebra',
}
}
*/
- ์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ์ฒด ํ๋กํผํฐ์ key๋ฅผ, ๋ฉ์๋์ ๋๊ธฐ๋
changeKeyPlan
ํ๋ผ๋ฏธํฐ์ ๋ช ์๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค. changeKeyPlan
์ ๊ฐ์ฒด์ด๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๊ต์ฒดํ target์ key๋ฅผ plan์ key๋ก, ์๋ก์ด key๋ฅผ ๋ฌธ์์ด ๊ฐ์ผ๋ก ๊ฐ์ง๋๋ค.- ๋ค๋ง ๋ฐ๋์ด์ผํ target์ ํน์ key๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๋ค๋ฉด, ๋ฌธ์์ด ๊ฐ์ ๋ช
์ํด์ค ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋ก (
:
)์ ์ฌ์ฉํ์ฌ ๊ต์ฒดํ target์ ํค์ ํจ๊ป ์๋ก์ด ํค๋ฅผ ๋ช ์ํด์ค ์ ์์ต๋๋ค. - TypeScript ์ฌ์ฉ์
ChangeKeyPlan
ํ์ ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
5. process()
const result = flattener({
userId: 12424,
userName: 'Max',
userAge: 25,
userProfile: {
userIntroduce: 'I love zebra.',
userFavoriteAnimal: 'zebra',
}
}).process((target:Target) => ({
userId: 10000,
userAge: (age:number) => `${age} years old`,
userProfile: {
userIntroduce: (text:string) => `Hello! My name is ${target.userName}. ${text}`,
},
})).returnResult()
/*
Result will be
{
userId: 10000
userName: 'Max',
userAge: '25 years old',
userProfile: {
userIntroduce: 'Hello! My name is Max. I love zebra.',
userFavoriteAnimal: 'zebra',
}
}
*/
- ์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ์ฒด ํ๋กํผํฐ๋ค์ ๊ฐ์ ๋ฉ์๋์ ๋๊ธฐ๋
processPlan
ํ๋ผ๋ฏธํฐ์ ๋ช ์๋ ๊ฐ์ผ๋ก ๊ฐ๊ณตํ๊ฑฐ๋, ๋ช ์๋ ํจ์๋ฅผ ์คํํ ๊ฐ์ผ๋ก ๊ฐ๊ณตํ๋ ๋ฉ์๋์ ๋๋ค. processPlan
ํ๋ผ๋ฏธํฐ๋ target object๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์์ ๋๋ค. ์ด ํจ์๊ฐ ๋ฆฌํดํ๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ค์ target object๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.processPlan
ํจ์๊ฐ ๋ฆฌํดํ๋ ๊ฐ์ฒด ํ๋กํผํฐ์ ๊ฐ์ผ๋ก๋ ๊ธฐ์กด target ๊ฐ์ฒด ํ๋กํผํฐ๊ฐ ๊ฐ์ง ๊ฐ์ ์ธ์๋ก ํ๋ ์ฝ๋ฐฑ ํจ์ ๋๋ ํน์ ๊ฐ์ ๋ช ์ํ ์ ์์ต๋๋ค. ์ฝ๋ฐฑ ํจ์์ผ๋๋ ๊ธฐ์กด target ๊ฐ์ฒด ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ฉํด ๊ฐ๊ณตํ ๊ฐ์ผ๋ก ๋ฐ๋๋ฉฐ, ํน์ ๊ฐ์ผ๋๋ target์ ๊ฐ์ overwrite๋ฉ๋๋ค.processPlan
๊ฐ์ฒด ํ๋กํผํฐ์ key๋ก๋ target object์ ์ด๋ฏธ ์กด์ฌํ๋ key๋ง ๋ช ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ key๋ ๋ฌด์ํฉ๋๋ค.target object
์ ์ด๋ฏธ ์กด์ฌํ๋ ํ๋กํผํฐ๋ง processํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉดaugment
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.process
๋ฉ์๋์์ ์ฌ๋ฌ ๊ฐ์ฒด ํ๋กํผํฐ๋ค์ ๋ณํ๋ ์๋ก ๋ ๋ฆฝ์ ์ ๋๋ค.processPlan
๊ฐ์ฒด์ ๊ฐ์ผ๋ก ๋๊ธด ์ฝ๋ฐฑ ํจ์๋ ์ด๋ฏธ process๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ์ง ์๊ณ ์๋ target ๊ฐ์ฒด์ ํ๋กํผํฐ์ ๊ฐ๋ง์ ์ฐธ์กฐํฉ๋๋ค.
6. augment()
const result = flattener({
userId: 12424,
userName: 'Max',
userAge: 25,
userProfile: {
userProfileText: 'My Name is Max.',
userFavoriteAnimal: 'zebra',
}
}).augment((target:Target) => {
const { userProfileText, userFavoriteAnimal } = target.userProfile
return {
isUserAdult: target.userAge > 19
userProfile: {
userIntroduce: `${userProfileText} My favorite animal is ${userFavoriteAnimal}.`,
}
},
}).returnResult()
/*
Result will be
{
userId: 10000
userName: 'Max',
userAge: 25,
isUserAdult: true,
userProfile: {
userProfileText: 'My Name is Max.',
userFavoriteAnimal: 'zebra',
userIntroduce: 'My name is Max. My favorite animal is zebra.',
}
}
*/
- target ๊ฐ์ฒด์ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ฝ์ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฆ๊ฐ์ํค๋ ๋ฉ์๋์ ๋๋ค.
augmentPlan
ํ๋ผ๋ฏธํฐ๋ target object๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์์ ๋๋ค. ์ด ํจ์๊ฐ ๋ฆฌํดํ๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ค์ target object๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.augmentPlan
๊ฐ์ฒด์ ๊ฐ์ ํจ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. target ๊ฐ์ฒด์ ์๋กญ๊ฒ ์ถ๊ฐ๋๋ ํ๋กํผํฐ๋ ํน์ ๊ฐ์ด๊ฑฐ๋, target object๋ง์ ์ฐธ์กฐํ์ฌ ๋ง๋ค์ด์ ธ์ผ ํฉ๋๋ค.augmentPlan
๊ฐ์ฒด์๋ ๊ธฐ์กดtarget object
์๋ ์๋ ์๋ก์ด key ๊ฐ๋ง ํฌํจํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.augment()
๋ฉ์๋๊ฐ ์ฆ๊ฐ์ ์ด์ ์ ๋ง์ถ๊ณ ์์ด์ ๊ทธ๋ ์ต๋๋ค. plan ๊ฐ์ฒด์ ๊ธฐ์กด key๊ฐ์ ์ฌ์ฉํด ์๋ก์ด ๊ฐ์ ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ ํ ์๋ ์์ง๋ง, ์ด๋ ์ด๋ฏธ '๊ฐ๊ณต'์ ์ข ๋ ์ด์ ์ด ๋ง์ถฐ์ ธ ์๋process()
๋ฉ์๋์์๋ ๊ฐ๋ฅํ ๋์์ ๋๋ค.
7. remove()
const result = flattener({
userId: 12424,
userName: 'Max',
userAge: 25,
userProfile: {
userProfileText: 'My Name is Max.',
userFavoriteAnimal: 'zebra',
userImage : {
mobile: '/image/12424/mobile',
desktop: '/image/12424/desktop',
}
}
}).remove([
'userId',
'userProfile.userProfileText',
'userProfile.userProfileImage.mobile',
]).returnResult()
/*
Result will be
{
userName: 'Max',
userAge: 25,
userProfile: {
userProfileText: 'My Name is Max.',
userFavoriteAnimal: 'zebra',
userImage : {
desktop: '/image/12424/desktop',
}
}
}
*/
- target ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ญ์ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ถ์์ํค๋ ๋ฉ์๋์ ๋๋ค.
removePlan
์ ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด๋ฉฐ, ๋ํธ ์ฐ์ฐ์(.
)๋ฅผ ํตํด ์ ๊ฑฐํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ํํํฉ๋๋ค.
8. returnResult()
- ์ ๋ค๋ฅธ ๋ฉ์๋๋ค์ ์์์์ ๋ณผ ์ ์๋ฏ,
returnResult()
๋ฉ์๋๋FlattenTarget
์ธ์คํด์ค์์ ๋ณ๊ฒฝ์ด ๋๋target object
๋ฅผ ๋ฐํํฉ๋๋ค. - ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์์ ๋ณ๊ฒฝ์ด ์๋ฃ๋ ๊ฐ์ฒด๋ฅผ ๋ด์ ๋๋ ๊ผญ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํด
FlattenTarget
์ธ์คํด์ค์์ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ธtarget object
๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. flatten()
ํจ์๊ฐ ๊ฐ์ฒด์ ์์ ์ ์์ํ๋ ์ง์ ์ ์ด๋ผ๋ฉด,returnResult()
๋ ์์ ์ ๋ง๋ฌด๋ฆฌํ๋ ๋ฉ์๋์ ๋๋ค.
Full Example
import { flattener, Target } from 'functional-flattener'
const mockData = {
user_id: 12424,
user_name: 'max',
user_age: 25,
user_profile: {
user_profile_text: 'I Love Zebra',
user_favorite_animal: { id: 3, animal_name: 'vulture' },
userProfileImage: {
mobile: '/image/12424/mobile',
desktop: '/image/12424/desktop',
},
user_friends: [
{ id: 12324, name: 'julie', favorite_animal: { id: 0, animal_name: 'tiger' } },
{ id: 11424, name: 'michael', favorite_animal: { id: 1, animal_name: 'lion' } },
{ id: 18924, name: 'shawn', favorite_animal: { id: 2, animal_name: 'monkey' } },
],
},
}
const processPlan = (target:Target) => ({
userId: (id:number) => id + 10000,
userProfile: {
userProfileText: (text:string) => `Hello! My name is ${target.userName}. ${text}`,
userFriends: (friends:Friend[]) => friends.map(
(friend:Friend) => ({ ...friend, name: `${friend.name} the ${friend.favoriteAnimal.animalName}` }),
),
},
})
const augmentPlan = (target:Target) => ({
isRecentSignUser: target.userId > 10000,
isUserAdult: target.userAge > 19,
userProfile: {
userFriendsFavoriteAnimals: target.userProfile.userFriends.map(
(friend:Friend) => friend.favoriteAnimal.animalName,
),
},
})
const removePlan = [
'userId',
'userProfile.userProfileImage.mobile',
]
const changePlan = {
userAge: 'userCurrentAge',
'userProfile:userCurrentProfile': {
userProfileText: 'userIntroduce',
'userFavoriteAnimal:userAnimal': {
animalName: 'name',
},
},
}
const result = flattener(mockData).case({ to: 'camel' })
.process(processPlan)
.augment(augmentPlan)
.remove(removePlan)
.returnResult()
FYI
๋ฉ์๋ ์ ์ฉ ์์
๋ฑํ ๋ฐ๋ผ์ผ ํ๋ ๋ฉ์๋ ์ ์ฉ ์์๋ ์์ง๋ง, flatten()
ํจ์๋ก FlattenTarget
์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ๋ ์งํ์ casing()
๋ฉ์๋๋ฅผ ๋จผ์ ์ ์ฉํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ESLint๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ถํ ์ ์ฉํ process()
ํน์ augment()
๋ฉ์๋์ ์ธ์๋ก ์ฐ์ด๋ plan
๊ฐ์ฒด์ ์นด๋ฉ ์ผ์ด์ค๊ฐ ์๋ ๋ค๋ฅธ ์ผ์ด์ค์ key
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ง์ผ๋ก๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์
๋๋ค.
process() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋, ๋ฐฐ์ด ์์ ๊ฐ์ฒด๋ ์ด๋ป๊ฒ modify ํ๋์?
const mockData = {
userFriends: [
{ id: 12324, name: 'julie', favoriteAnimal: { id: 0, animalName: 'tiger' } },
{ id: 11424, name: 'michael', favoriteAnimal: { id: 1, animalName: 'lion' } },
{ id: 18924, name: 'shawn', favoriteAnimal: { id: 2, animalName: 'monkey' } },
],
}
const processPlan = (target:Target) => ({
userFriends: (friends:Friend[]) => friends.map(
(friend:Friend) => ({ ...friend, name: `${friend.name} the ${friend.favoriteAnimal.animalName}` }),
)},
)
const result = flattener(mockData)
.process(processPlan)
.returnResult()
๋ฐฐ์ด ์์ ๊ฐ์ฒด๋ฅผ ์์ ํ๊ณ ์ถ์ ๋๋ ๋ฐฐ์ด์ ์์ ํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋๊ธฐ๋ ์์ ํ ์ ๋ฐฐ์ด์ ๋ฐํํ๋ map
์ด๋ filter
์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
ToDo
- Add
FlattenTarget.prototype.modify()
: This method can modify target object according to modify plan.Modify()
will be a superset method of process, changeKey, augment and remove method. It will be going to operate those method`s modification all at once. - Add
README.md
written in English - Add More Detail error handling
- Add More test cases
Contribution
- Anyone can open a
pull request
orissues
. Just ensure passing every existing tests suites in./lib/test dir
. - There is
github action
to verify that all test suites are passed whenpull reqeust
is opened. - MIT License