mirror of
https://github.com/toss/es-toolkit.git
synced 2024-12-24 00:11:45 +03:00
style(*): Setup prettier and apply formatting (#24)
* chore: add prettierrc * chore: apply format with prettier config * chore: eslint error fix
This commit is contained in:
parent
21fa121853
commit
cf65b2c601
@ -95,4 +95,4 @@ workflows:
|
||||
- check-peer:
|
||||
filters:
|
||||
branches:
|
||||
ignore: main
|
||||
ignore: main
|
||||
|
6
.github/CONTRIBUTING.md
vendored
6
.github/CONTRIBUTING.md
vendored
@ -10,7 +10,7 @@ Note that we value performance, simplicity of implementation, and detailed docum
|
||||
|
||||
### 1.1 Performance
|
||||
|
||||
All functions es-toolkit provides should be more performant than or similar with that of alternative libraries provide.
|
||||
All functions es-toolkit provides should be more performant than or similar with that of alternative libraries provide.
|
||||
|
||||
We measure the performance of our library every time our code is edited. We are using [vitest's benchmark feature](https://vitest.dev/api/#bench). For our benchmark code, please refer to our [benchmark directory](https://github.com/toss/es-toolkit/tree/main/benchmarks).
|
||||
|
||||
@ -18,13 +18,13 @@ When a new functionality is added, a benchmark code should be added. Please add
|
||||
|
||||
### 1.2 Simplicity
|
||||
|
||||
We value implementation and interface simplicity over a variety of features for performance, code readability, and easy maintenance. Our functions will not provide complex options to suit every usecase.
|
||||
We value implementation and interface simplicity over a variety of features for performance, code readability, and easy maintenance. Our functions will not provide complex options to suit every usecase.
|
||||
|
||||
In this manner, instead of having complex options of making full use of overloading, etc, to support edge cases, we aim to provide the most simplest interface and implementation for the most common 85% usecases.
|
||||
|
||||
### 1.3 Documentation
|
||||
|
||||
All of our functions should be documented in detail for easy reference. All functions should have the jsdoc and corresponding documents [in our documentation directory](https://github.com/toss/es-toolkit/tree/main/docs) for all of their features.
|
||||
All of our functions should be documented in detail for easy reference. All functions should have the jsdoc and corresponding documents [in our documentation directory](https://github.com/toss/es-toolkit/tree/main/docs) for all of their features.
|
||||
|
||||
We use English as our primary language, but we aim to support Korean documents in our best effort. If you have difficulties writing Korean documents, please let our contributors know so that we can provide the corresponding Korean documents for you.
|
||||
|
||||
|
6
.github/workflows/broken-link-checker.yml
vendored
6
.github/workflows/broken-link-checker.yml
vendored
@ -14,8 +14,8 @@ jobs:
|
||||
- run: corepack enable
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
cache: "yarn"
|
||||
cache-dependency-path: "yarn.lock"
|
||||
node-version-file: ".nvmrc"
|
||||
cache: 'yarn'
|
||||
cache-dependency-path: 'yarn.lock'
|
||||
node-version-file: '.nvmrc'
|
||||
- run: yarn install
|
||||
- run: yarn blc ${{ github.event.inputs.url }} --ro
|
||||
|
12
.github/workflows/release.yml
vendored
12
.github/workflows/release.yml
vendored
@ -3,9 +3,9 @@ name: Release
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "*"
|
||||
- '*'
|
||||
tags:
|
||||
- "v*.*.*"
|
||||
- 'v*.*.*'
|
||||
|
||||
jobs:
|
||||
release:
|
||||
@ -20,9 +20,9 @@ jobs:
|
||||
- run: corepack enable
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
cache: "yarn"
|
||||
cache-dependency-path: "yarn.lock"
|
||||
node-version-file: ".nvmrc"
|
||||
cache: 'yarn'
|
||||
cache-dependency-path: 'yarn.lock'
|
||||
node-version-file: '.nvmrc'
|
||||
- if: github.ref_type == 'branch'
|
||||
run: |
|
||||
jq \
|
||||
@ -41,7 +41,7 @@ jobs:
|
||||
heading-title-text: version ${{ github.ref_name }}
|
||||
ignore-case: true
|
||||
omit-heading: true
|
||||
- run: "cat ${{ steps.extract-changelog.outputs.output-file }}"
|
||||
- run: 'cat ${{ steps.extract-changelog.outputs.output-file }}'
|
||||
- name: Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
|
13
.prettierignore
Normal file
13
.prettierignore
Normal file
@ -0,0 +1,13 @@
|
||||
.yarn/*
|
||||
|
||||
.pnp.cjs
|
||||
.pnp.loader.mjs
|
||||
|
||||
node_modules
|
||||
coverage
|
||||
dist
|
||||
esm
|
||||
.junit
|
||||
out
|
||||
*.d.ts
|
||||
*.tgz
|
14
.prettierrc
Normal file
14
.prettierrc
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"arrowParens": "avoid",
|
||||
"bracketSameLine": false,
|
||||
"bracketSpacing": true,
|
||||
"endOfLine": "lf",
|
||||
"jsxSingleQuote": false,
|
||||
"printWidth": 120,
|
||||
"proseWrap": "preserve",
|
||||
"quoteProps": "as-needed",
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "es5"
|
||||
}
|
6
.vscode/extensions.json
vendored
6
.vscode/extensions.json
vendored
@ -1,7 +1,3 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"arcanis.vscode-zipfs",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode"
|
||||
]
|
||||
"recommendations": ["arcanis.vscode-zipfs", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
|
||||
}
|
||||
|
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@ -13,5 +13,5 @@
|
||||
"editor.formatOnSave": true,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": "explicit"
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,6 @@ es-toolkit은 높은 성능과 작은 번들 사이즈, 강력한 타입을 자
|
||||
- es-toolkit은 TypeScript 타입이 내장되어 있고, 직관적이고 정확한 타입을 추구해요. [isNotNil](https://es-toolkit.slash.page/ko/reference/predicate/isNotNil.html) 같은 사용하기 편리한 유틸리티 함수도 제공해요.
|
||||
- es-toolkit은 100% 테스트 커버리지를 유지하면서, 높은 안정성을 자랑해요.
|
||||
|
||||
|
||||
## 기여하기
|
||||
|
||||
커뮤니티에 있는 모든 분들에게 기여를 환영해요. 아래에 작성되어 있는 기여 가이드를 확인하세요.
|
||||
|
@ -12,7 +12,6 @@ es-toolkit is a state-of-the-art, high-performance JavaScript utility library wi
|
||||
- es-toolkit includes built-in TypeScript support, with straightforward yet robust types. It also provides useful type guards such as [isNotNil](https://es-toolkit.slash.page/reference/predicate/isNotNil.html).
|
||||
- es-toolkit is battle-tested with 100% test coverage, ensuring reliability and robustness.
|
||||
|
||||
|
||||
## Contributing
|
||||
|
||||
We welcome contribution from everyone in the community. Read below for detailed contribution guide.
|
||||
|
@ -1,6 +1,3 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
require.resolve('@babel/preset-env'),
|
||||
require.resolve('@babel/preset-typescript'),
|
||||
],
|
||||
presets: [require.resolve('@babel/preset-env'), require.resolve('@babel/preset-typescript')],
|
||||
};
|
||||
|
@ -5,9 +5,9 @@ import { chunk as chunkLodash } from 'lodash';
|
||||
describe('chunk', () => {
|
||||
bench('es-toolkit', () => {
|
||||
chunkToolkit([1, 2, 3, 4, 5, 6], 3);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
chunkLodash([1, 2, 3, 4, 5, 6], 3);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -4,12 +4,12 @@ import { clamp as clampLodash } from 'lodash';
|
||||
|
||||
describe('clamp', () => {
|
||||
bench('es-toolkit', () => {
|
||||
clampToolkit(10, 5, 15)
|
||||
clampToolkit(10, 5)
|
||||
})
|
||||
clampToolkit(10, 5, 15);
|
||||
clampToolkit(10, 5);
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
clampLodash(10, 5, 15)
|
||||
clampLodash(10, 5)
|
||||
})
|
||||
});
|
||||
clampLodash(10, 5, 15);
|
||||
clampLodash(10, 5);
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { difference as differenceLodash } from 'lodash';
|
||||
describe('difference', () => {
|
||||
bench('es-toolkit', () => {
|
||||
differenceToolkit([1, 2, 3], [2]);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
differenceLodash([1, 2, 3], [2]);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { differenceBy as differenceByLodash } from 'lodash';
|
||||
describe('differenceBy', () => {
|
||||
bench('es-toolkit', () => {
|
||||
differenceByToolkit([1.2, 2.3, 3.4], [1.2], Math.floor);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
differenceByLodash([1.2, 2.3, 3.4], [1.2], Math.floor);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { differenceWith as differenceWithLodash } from 'lodash';
|
||||
describe('differenceWith', () => {
|
||||
bench('es-toolkit', () => {
|
||||
differenceWithToolkit([1.2, 2.3, 3.4], [1.2], (x, y) => Math.floor(x) === Math.floor(y));
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
differenceWithLodash([1.2, 2.3, 3.4], [1.2], (x, y) => Math.floor(x) === Math.floor(y));
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { drop as dropLodash } from 'lodash';
|
||||
describe('drop', () => {
|
||||
bench('es-toolkit', () => {
|
||||
dropToolkit([1, 2, 3, 4, 5, 6], 3);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
dropLodash([1, 2, 3, 4, 5, 6], 3);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { dropRight as dropRightLodash } from 'lodash';
|
||||
describe('dropRight', () => {
|
||||
bench('es-toolkit', () => {
|
||||
dropRightToolkit([1, 2, 3, 4, 5, 6], 3);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
dropRightLodash([1, 2, 3, 4, 5, 6], 3);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { dropRightWhile as dropRightWhileLodash } from 'lodash';
|
||||
describe('dropRightWhile', () => {
|
||||
bench('es-toolkit', () => {
|
||||
dropRightWhileToolkit([1.2, 2.3, 3.4], x => x < 2);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
dropRightWhileLodash([1.2, 2.3, 3.4], x => x < 2);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { dropWhile as dropWhileLodash } from 'lodash';
|
||||
describe('dropWhile', () => {
|
||||
bench('es-toolkit', () => {
|
||||
dropWhileToolkit([1.2, 2.3, 3.4], x => x < 2);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
dropWhileLodash([1.2, 2.3, 3.4], x => x < 2);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -9,11 +9,11 @@ describe('groupBy', () => {
|
||||
{ category: 'fruit', name: 'banana' },
|
||||
{ category: 'vegetable', name: 'carrot' },
|
||||
{ category: 'fruit', name: 'pear' },
|
||||
{ category: 'vegetable', name: 'broccoli' }
|
||||
{ category: 'vegetable', name: 'broccoli' },
|
||||
];
|
||||
|
||||
|
||||
groupByToolkit(array, item => item.category);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const array = [
|
||||
@ -21,9 +21,9 @@ describe('groupBy', () => {
|
||||
{ category: 'fruit', name: 'banana' },
|
||||
{ category: 'vegetable', name: 'carrot' },
|
||||
{ category: 'fruit', name: 'pear' },
|
||||
{ category: 'vegetable', name: 'broccoli' }
|
||||
{ category: 'vegetable', name: 'broccoli' },
|
||||
];
|
||||
|
||||
|
||||
groupByLodash(array, item => item.category);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { intersection as intersectionLodash } from 'lodash';
|
||||
describe('intersection', () => {
|
||||
bench('es-toolkit', () => {
|
||||
intersectionToolkit([1, 2, 3], [2, 4]);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
intersectionLodash([1, 2, 3], [2, 4]);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -8,12 +8,12 @@ describe('intersectionBy', () => {
|
||||
const array2 = [{ id: 2 }, { id: 4 }];
|
||||
const mapper = item => item.id;
|
||||
intersectionByToolkit(array1, array2, mapper);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const array1 = [{ id: 1 }, { id: 2 }, { id: 3 }];
|
||||
const array2 = [{ id: 2 }, { id: 4 }];
|
||||
const mapper = item => item.id;
|
||||
intersectionByLodash(array1, array2, mapper);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -8,12 +8,12 @@ describe('intersectionWith', () => {
|
||||
const array2 = [{ id: 2 }, { id: 4 }];
|
||||
const areItemsEqual = (a, b) => a.id === b.id;
|
||||
intersectionWithToolkit(array1, array2, areItemsEqual);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const array1 = [{ id: 1 }, { id: 2 }, { id: 3 }];
|
||||
const array2 = [{ id: 2 }, { id: 4 }];
|
||||
const areItemsEqual = (a, b) => a.id === b.id;
|
||||
intersectionWithLodash(array1, array2, areItemsEqual);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -8,12 +8,12 @@ describe('isNil', () => {
|
||||
isNilToolkit(undefined);
|
||||
isNilToolkit(123);
|
||||
isNilToolkit([1, 2, 3]);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
isNilLodash(null);
|
||||
isNilLodash(undefined);
|
||||
isNilLodash(123);
|
||||
isNilLodash([1, 2, 3]);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -4,10 +4,10 @@ import { omit as omitLodash } from 'lodash';
|
||||
|
||||
describe('omit', () => {
|
||||
bench('es-toolkit', () => {
|
||||
omitToolkit({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar'])
|
||||
})
|
||||
omitToolkit({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar']);
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
omitLodash({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar'])
|
||||
})
|
||||
});
|
||||
omitLodash({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar']);
|
||||
});
|
||||
});
|
||||
|
@ -1,17 +1,17 @@
|
||||
import { bench, describe } from 'vitest';
|
||||
import { omitBy as omitByToolkit } from 'es-toolkit';
|
||||
import { omitBy as omitByLodash } from 'lodash';
|
||||
import { bench, describe } from 'vitest';
|
||||
|
||||
describe('omitBy', () => {
|
||||
bench('es-toolkit', () => {
|
||||
const obj = { a: 1, b: 'omit', c: 3 };
|
||||
const shouldOmit = (value: number | string, key: string) => typeof value === 'string';
|
||||
const shouldOmit = (value: number | string) => typeof value === 'string';
|
||||
omitByToolkit(obj, shouldOmit);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const obj = { a: 1, b: 'omit', c: 3 };
|
||||
const shouldOmit = (value: number | string, key: string) => typeof value === 'string';
|
||||
const shouldOmit = (value: number | string) => typeof value === 'string';
|
||||
omitByLodash(obj, shouldOmit);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { partition as partitionLodash } from 'lodash';
|
||||
describe('partition', () => {
|
||||
bench('es-toolkit', () => {
|
||||
partitionToolkit([1, 2, 3, 4, 5], x => x < 3);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
partitionLodash([1, 2, 3], x => x < 3);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -4,10 +4,10 @@ import { pick as pickLodash } from 'lodash';
|
||||
|
||||
describe('pick', () => {
|
||||
bench('es-toolkit', () => {
|
||||
pickToolkit({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar'])
|
||||
})
|
||||
pickToolkit({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar']);
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
pickLodash({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar'])
|
||||
})
|
||||
});
|
||||
pickLodash({ foo: 1, bar: 2, baz: 3 }, ['foo', 'bar']);
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { round as roundLodash } from 'lodash';
|
||||
describe('round', () => {
|
||||
bench('es-toolkit', () => {
|
||||
roundToolkit(1.2345, 2);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
roundLodash(1.2345, 2);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -6,10 +6,10 @@ describe('sample', () => {
|
||||
bench('es-toolkit', () => {
|
||||
const array = [1, 2, 3, 4, 5];
|
||||
sampleToolkit(array);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const array = [1, 2, 3, 4, 5];
|
||||
sampleLodash(array);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -6,10 +6,10 @@ describe('shuffle', () => {
|
||||
bench('es-toolkit', () => {
|
||||
const array = [1, 2, 3, 4, 5];
|
||||
shuffleToolkit(array);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const array = [1, 2, 3, 4, 5];
|
||||
shuffleLodash(array);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { sum as sumLodash } from 'lodash';
|
||||
describe('sum', () => {
|
||||
bench('es-toolkit', () => {
|
||||
sumToolkit([1, 2, 3]);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
sumLodash([1, 2, 3]);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { take as takeLodash } from 'lodash';
|
||||
describe('take', () => {
|
||||
bench('es-toolkit', () => {
|
||||
takeToolkit([1, 2, 3, 4], 2);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
takeLodash([1, 2, 3, 4], 2);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { takeRight as takeRightLodash } from 'lodash';
|
||||
describe('takeRight', () => {
|
||||
bench('es-toolkit', () => {
|
||||
takeRightToolkit([1, 2, 3, 4], 2);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
takeRightLodash([1, 2, 3, 4], 2);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { takeRightWhile as takeRightWhileLodash } from 'lodash';
|
||||
describe('takeRightWhile', () => {
|
||||
bench('es-toolkit', () => {
|
||||
takeRightWhileToolkit([5, 4, 3, 2, 1], n => n < 4);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
takeRightWhileLodash([5, 4, 3, 2, 1], n => n < 4);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { takeWhile as takeWhileLodash } from 'lodash';
|
||||
describe('takeWhile', () => {
|
||||
bench('es-toolkit', () => {
|
||||
takeWhileToolkit([5, 4, 3, 2, 1], n => n < 4);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
takeWhileLodash([5, 4, 3, 2, 1], n => n < 4);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,17 +1,17 @@
|
||||
import { bench, describe } from 'vitest';
|
||||
import { union as unionToolkit } from 'es-toolkit';
|
||||
import { union as unionLodash } from 'lodash';
|
||||
import { bench, describe } from 'vitest';
|
||||
|
||||
describe('union', () => {
|
||||
bench('es-toolkit', () => {
|
||||
const array1 = [1, 2, 3];
|
||||
const array2 = [3, 4, 5];
|
||||
const result = unionToolkit(array1, array2);
|
||||
})
|
||||
unionToolkit(array1, array2);
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const array1 = [1, 2, 3];
|
||||
const array2 = [3, 4, 5];
|
||||
const result = unionLodash(array1, array2);
|
||||
})
|
||||
});
|
||||
unionLodash(array1, array2);
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { unionBy as unionByLodash } from 'lodash';
|
||||
describe('unionBy', () => {
|
||||
bench('es-toolkit', () => {
|
||||
unionByToolkit([{ id: 1 }, { id: 2 }], [{ id: 2 }, { id: 3 }], x => x.id);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
unionByLodash([{ id: 1 }, { id: 2 }], [{ id: 2 }, { id: 3 }], x => x.id);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -8,12 +8,12 @@ describe('unionWith', () => {
|
||||
const array2 = [{ id: 2 }, { id: 3 }];
|
||||
const areItemsEqual = (a, b) => a.id === b.id;
|
||||
unionWithToolkit(array1, array2, areItemsEqual);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const array1 = [{ id: 1 }, { id: 2 }];
|
||||
const array2 = [{ id: 2 }, { id: 3 }];
|
||||
const areItemsEqual = (a, b) => a.id === b.id;
|
||||
unionWithLodash(array1, array2, areItemsEqual);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { uniq as uniqLodash } from 'lodash';
|
||||
describe('uniq', () => {
|
||||
bench('es-toolkit', () => {
|
||||
uniqToolkit([11, 2, 3, 44, 11, 2, 3]);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
uniqLodash([11, 2, 3, 44, 11, 2, 3]);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { xor as xorLodash } from 'lodash';
|
||||
describe('xor', () => {
|
||||
bench('es-toolkit', () => {
|
||||
xorToolkit([1, 2, 3, 4], [3, 4, 5, 6]);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
xorLodash([1, 2, 3, 4], [3, 4, 5, 6]);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -6,10 +6,10 @@ describe('xorBy', () => {
|
||||
bench('es-toolkit', () => {
|
||||
const idMapper = obj => obj.id;
|
||||
xorByToolkit([{ id: 1 }, { id: 2 }], [{ id: 2 }, { id: 3 }], idMapper);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const idMapper = obj => obj.id;
|
||||
xorByLodash([{ id: 1 }, { id: 2 }], [{ id: 2 }, { id: 3 }], idMapper);
|
||||
})
|
||||
});
|
||||
});
|
||||
|
@ -1,14 +1,13 @@
|
||||
import { bench, describe } from 'vitest';
|
||||
import { xorWith as xorWithToolkit } from 'es-toolkit';
|
||||
import { xorWith as xorWithLodash } from 'lodash';
|
||||
import { bench, describe } from 'vitest';
|
||||
|
||||
describe('xorWith', () => {
|
||||
bench('es-toolkit', () => {
|
||||
xorWithToolkit([{ id: 1 }, { id: 2 }], [{ id: 2 }, { id: 3 }], (x, y) => x.id === y.id);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const idMapper = obj => obj.id;
|
||||
xorWithLodash([{ id: 1 }, { id: 2 }], [{ id: 2 }, { id: 3 }], (x, y) => x.id === y.id);
|
||||
})
|
||||
});
|
||||
});
|
||||
|
@ -5,9 +5,9 @@ import { zip as zipLodash } from 'lodash';
|
||||
describe('zip', () => {
|
||||
bench('es-toolkit', () => {
|
||||
zipToolkit([1, 2, 3, 4], [3, 4, 5, 6]);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
zipLodash([1, 2, 3, 4], [3, 4, 5, 6]);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -8,12 +8,12 @@ describe('zipWith', () => {
|
||||
const arr2 = [3, 4];
|
||||
const arr3 = [5, 6];
|
||||
zipWithToolkit(arr1, arr2, arr3, (a, b, c) => `${a}${b}${c}`);
|
||||
})
|
||||
});
|
||||
|
||||
bench('lodash', () => {
|
||||
const arr1 = [1, 2];
|
||||
const arr2 = [3, 4];
|
||||
const arr3 = [5, 6];
|
||||
zipWithLodash(arr1, arr2, arr3, (a, b, c) => `${a}${b}${c}`);
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -7,7 +7,6 @@ export default defineConfig({
|
||||
...shared,
|
||||
locales: {
|
||||
root: { label: 'English', ...en },
|
||||
ko: { label: '한국어', ...ko }
|
||||
ko: { label: '한국어', ...ko },
|
||||
},
|
||||
})
|
||||
|
||||
});
|
||||
|
@ -1,8 +1,9 @@
|
||||
import { defineConfig, type DefaultTheme } from 'vitepress'
|
||||
import { defineConfig, type DefaultTheme } from 'vitepress';
|
||||
|
||||
export const en = defineConfig({
|
||||
lang: 'en',
|
||||
description: 'A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations.',
|
||||
description:
|
||||
'A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations.',
|
||||
|
||||
themeConfig: {
|
||||
nav: nav(),
|
||||
@ -11,22 +12,22 @@ export const en = defineConfig({
|
||||
|
||||
editLink: {
|
||||
pattern: 'https://github.com/toss/es-toolkit/edit/main/docs/:path',
|
||||
text: 'Edit this page on GitHub'
|
||||
text: 'Edit this page on GitHub',
|
||||
},
|
||||
|
||||
footer: {
|
||||
message: 'Released under the MIT License.',
|
||||
copyright: `Copyright © ${new Date().getFullYear()} Viva Republica, Inc.`
|
||||
}
|
||||
}
|
||||
})
|
||||
copyright: `Copyright © ${new Date().getFullYear()} Viva Republica, Inc.`,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
function nav(): DefaultTheme.NavItem[] {
|
||||
return [
|
||||
{ text: 'Home', link: '/' },
|
||||
{ text: 'Introduction', link: '/intro' },
|
||||
{ text: 'Reference', link: '/reference/array/chunk' },
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
function sidebar(): DefaultTheme.Sidebar {
|
||||
@ -38,7 +39,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'Installation', link: '/installation' },
|
||||
{ text: 'Impact on Bundle Size', link: '/bundle-size' },
|
||||
{ text: 'Performance', link: '/performance' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Reference',
|
||||
@ -74,7 +75,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'xorWith', link: '/reference/array/xorWith' },
|
||||
{ text: 'zip', link: '/reference/array/zip' },
|
||||
{ text: 'zipWith', link: '/reference/array/zipWith' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Function Utilities',
|
||||
@ -82,7 +83,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'debounce', link: '/reference/function/debounce' },
|
||||
{ text: 'throttle', link: '/reference/function/throttle' },
|
||||
{ text: 'once', link: '/reference/function/once' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Math Utilities',
|
||||
@ -90,7 +91,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'clamp', link: '/reference/math/clamp' },
|
||||
{ text: 'round', link: '/reference/math/round' },
|
||||
{ text: 'sum', link: '/reference/math/sum' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Object Utilities',
|
||||
@ -99,7 +100,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'omitBy', link: '/reference/object/omitBy' },
|
||||
{ text: 'pick', link: '/reference/object/pick' },
|
||||
{ text: 'pickBy', link: '/reference/object/pickBy' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Predicates',
|
||||
@ -108,15 +109,13 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'isNotNil', link: '/reference/predicate/isNotNil' },
|
||||
{ text: 'isNull', link: '/reference/predicate/isNull' },
|
||||
{ text: 'isUndefined', link: '/reference/predicate/isUndefined' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Promise Utilities',
|
||||
items: [
|
||||
{ text: 'delay', link: '/reference/promise/delay' },
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
items: [{ text: 'delay', link: '/reference/promise/delay' }],
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { defineConfig, type DefaultTheme } from 'vitepress'
|
||||
import { defineConfig, type DefaultTheme } from 'vitepress';
|
||||
|
||||
export const ko = defineConfig({
|
||||
lang: 'ko',
|
||||
@ -11,22 +11,22 @@ export const ko = defineConfig({
|
||||
|
||||
editLink: {
|
||||
pattern: 'https://github.com/toss/es-toolkit/edit/main/docs/:path',
|
||||
text: 'GitHub에서 수정하기'
|
||||
text: 'GitHub에서 수정하기',
|
||||
},
|
||||
|
||||
footer: {
|
||||
message: 'MIT 라이선스에 따라 배포됩니다.',
|
||||
copyright: `Copyright © ${new Date().getFullYear()} Viva Republica, Inc.`
|
||||
}
|
||||
}
|
||||
})
|
||||
copyright: `Copyright © ${new Date().getFullYear()} Viva Republica, Inc.`,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
function nav(): DefaultTheme.NavItem[] {
|
||||
return [
|
||||
{ text: '홈', link: '/ko' },
|
||||
{ text: '소개', link: '/ko/intro' },
|
||||
{ text: '레퍼런스', link: '/ko/reference/array/chunk' },
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
function sidebar(): DefaultTheme.Sidebar {
|
||||
@ -38,7 +38,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: '설치', link: '/ko/installation' },
|
||||
{ text: '번들 사이즈', link: '/ko/bundle-size' },
|
||||
{ text: '성능', link: '/ko/performance' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '레퍼런스',
|
||||
@ -74,7 +74,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'xorWith', link: '/ko/reference/array/xorWith' },
|
||||
{ text: 'zip', link: '/ko/reference/array/zip' },
|
||||
{ text: 'zipWith', link: '/ko/reference/array/zipWith' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '함수',
|
||||
@ -82,7 +82,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'debounce', link: '/ko/reference/function/debounce' },
|
||||
{ text: 'throttle', link: '/ko/reference/function/throttle' },
|
||||
{ text: 'once', link: '/ko/reference/function/once' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '숫자',
|
||||
@ -90,7 +90,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'clamp', link: '/ko/reference/math/clamp' },
|
||||
{ text: 'round', link: '/ko/reference/math/round' },
|
||||
{ text: 'sum', link: '/ko/reference/math/sum' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '객체',
|
||||
@ -99,7 +99,7 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'omitBy', link: '/ko/reference/object/omitBy' },
|
||||
{ text: 'pick', link: '/ko/reference/object/pick' },
|
||||
{ text: 'pickBy', link: '/ko/reference/object/pickBy' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '타입 가드',
|
||||
@ -108,21 +108,18 @@ function sidebar(): DefaultTheme.Sidebar {
|
||||
{ text: 'isNotNil', link: '/ko/reference/predicate/isNotNil' },
|
||||
{ text: 'isNull', link: '/ko/reference/predicate/isNull' },
|
||||
{ text: 'isUndefined', link: '/ko/reference/predicate/isUndefined' },
|
||||
]
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Promise',
|
||||
items: [
|
||||
{ text: 'delay', link: '/ko/reference/promise/delay' },
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
items: [{ text: 'delay', link: '/ko/reference/promise/delay' }],
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
export const search: DefaultTheme.LocalSearchOptions["locales"] = {
|
||||
export const search: DefaultTheme.LocalSearchOptions['locales'] = {
|
||||
ko: {
|
||||
translations: {
|
||||
button: {
|
||||
@ -143,7 +140,7 @@ export const search: DefaultTheme.LocalSearchOptions["locales"] = {
|
||||
},
|
||||
noResultsText: '검색 결과를 찾지 못했어요.',
|
||||
resetButtonTitle: '모두 지우기',
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -3,7 +3,7 @@ import path from 'path';
|
||||
import { defineConfig } from 'vitepress';
|
||||
import { search as koSearch } from './ko.mts';
|
||||
|
||||
const require = createRequire(import.meta.url)
|
||||
const require = createRequire(import.meta.url);
|
||||
|
||||
export const shared = defineConfig({
|
||||
title: 'es-toolkit',
|
||||
@ -58,25 +58,27 @@ export const shared = defineConfig({
|
||||
options: {
|
||||
locales: {
|
||||
...koSearch,
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
socialLinks: [
|
||||
{ icon: 'github', link: 'https://github.com/toss/es-toolkit' }
|
||||
],
|
||||
socialLinks: [{ icon: 'github', link: 'https://github.com/toss/es-toolkit' }],
|
||||
},
|
||||
|
||||
vite: {
|
||||
resolve: {
|
||||
alias: {
|
||||
'vue': path.dirname(require.resolve('vue/package.json', {
|
||||
paths: [require.resolve('vitepress')],
|
||||
})),
|
||||
'vue/server-renderer': path.dirname(require.resolve('vue/server-renderer', {
|
||||
paths: [require.resolve('vitepress')],
|
||||
})),
|
||||
}
|
||||
}
|
||||
vue: path.dirname(
|
||||
require.resolve('vue/package.json', {
|
||||
paths: [require.resolve('vitepress')],
|
||||
})
|
||||
),
|
||||
'vue/server-renderer': path.dirname(
|
||||
require.resolve('vue/server-renderer', {
|
||||
paths: [require.resolve('vitepress')],
|
||||
})
|
||||
),
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
});
|
||||
|
@ -1,8 +1,9 @@
|
||||
:root {
|
||||
--vp-nav-logo-height: 16px;
|
||||
--vp-font-family-base: "Toss Product Sans", ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
||||
--vp-font-family-base: 'Toss Product Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji',
|
||||
'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
||||
}
|
||||
|
||||
:root[lang=ko] {
|
||||
:root[lang='ko'] {
|
||||
word-break: keep-all;
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import DefaultTheme from 'vitepress/theme'
|
||||
import './index.css'
|
||||
import DefaultTheme from 'vitepress/theme';
|
||||
import './index.css';
|
||||
|
||||
export default DefaultTheme
|
||||
export default DefaultTheme;
|
||||
|
@ -1,24 +1,23 @@
|
||||
---
|
||||
description: The minimal bundle footprint offered by es-toolkit
|
||||
---
|
||||
Bundle Footprint
|
||||
============
|
||||
|
||||
# Bundle Footprint
|
||||
|
||||
![Graph showing the difference in bundle size between es-toolkit and lodash. There is a difference up to 97% in bundle size.](/assets/bundle-size.png)
|
||||
|
||||
With its modern implementation, es-toolkit significantly reduces its bundle size, cutting it down by up to 97% compared to other libraries like lodash.
|
||||
With its modern implementation, es-toolkit significantly reduces its bundle size, cutting it down by up to 97% compared to other libraries like lodash.
|
||||
|
||||
This makes es-toolkit the most efficient in terms of bundle size, with some utility functions being as small as less than 100 bytes.
|
||||
|
||||
## Bundle Footprint Comparison
|
||||
|
||||
| | es-toolkit@0.0.1 | lodash-es@4.17.21 | Difference |
|
||||
|-----------------------------------------------|------------------|--------------------|------------|
|
||||
| [sample](./reference/array/sample) | 88 bytes | 2000 bytes | -95.6% |
|
||||
| [difference](./reference/array/difference) | 91 bytes | 3190 bytes | -97.2% |
|
||||
| [sum](./reference/math/sum) | 152 bytes | 413 bytes | -63.2% |
|
||||
| [debounce](./reference/function/debounce) | 144 bytes | 1400 bytes | -89.7% |
|
||||
| [throttle](./reference/function/throttle) | 110 bytes | 1460 bytes | -92.5% |
|
||||
| [pick](./reference/object/pick) | 657 bytes | 3860 bytes | -83.0% |
|
||||
| [zip](./reference/array/zip) | 797 bytes | 1790 bytes | -55.5% |
|
||||
|
||||
| | es-toolkit@0.0.1 | lodash-es@4.17.21 | Difference |
|
||||
| ------------------------------------------ | ---------------- | ----------------- | ---------- |
|
||||
| [sample](./reference/array/sample) | 88 bytes | 2000 bytes | -95.6% |
|
||||
| [difference](./reference/array/difference) | 91 bytes | 3190 bytes | -97.2% |
|
||||
| [sum](./reference/math/sum) | 152 bytes | 413 bytes | -63.2% |
|
||||
| [debounce](./reference/function/debounce) | 144 bytes | 1400 bytes | -89.7% |
|
||||
| [throttle](./reference/function/throttle) | 110 bytes | 1460 bytes | -92.5% |
|
||||
| [pick](./reference/object/pick) | 657 bytes | 3860 bytes | -83.0% |
|
||||
| [zip](./reference/array/zip) | 797 bytes | 1790 bytes | -55.5% |
|
||||
|
@ -3,9 +3,9 @@
|
||||
layout: home
|
||||
|
||||
hero:
|
||||
name: "es-toolkit"
|
||||
text: "State-of-the-art JavaScript utility library"
|
||||
# tagline:
|
||||
name: 'es-toolkit'
|
||||
text: 'State-of-the-art JavaScript utility library'
|
||||
# tagline:
|
||||
actions:
|
||||
- theme: brand
|
||||
text: About es-toolkit
|
||||
@ -29,4 +29,3 @@ features:
|
||||
- title: Battle-tested
|
||||
details: es-toolkit has 100% test coverage, ensuring maximum robustness.
|
||||
---
|
||||
|
||||
|
@ -7,14 +7,13 @@ next:
|
||||
text: Impact on Bundle Size
|
||||
link: ./bundle-size
|
||||
---
|
||||
Installation
|
||||
============
|
||||
|
||||
# Installation
|
||||
|
||||
es-toolkit is available on [npm](https://npmjs.com/package/es-toolkit) for Node.js, Deno, and Bun.
|
||||
|
||||
## Node.js
|
||||
|
||||
Node.js
|
||||
---
|
||||
es-toolkit supports Node.js 18 or later. Install es-toolkit with the following command:
|
||||
|
||||
```sh
|
||||
@ -23,9 +22,7 @@ yarn add es-toolkit
|
||||
pnpm install es-toolkit
|
||||
```
|
||||
|
||||
|
||||
Deno
|
||||
----
|
||||
## Deno
|
||||
|
||||
es-toolkit is also available on npm for Deno. Use es-toolkit with the `npm:` specifier:
|
||||
|
||||
@ -33,12 +30,10 @@ es-toolkit is also available on npm for Deno. Use es-toolkit with the `npm:` spe
|
||||
import { chunk } from 'npm:es-toolkit@1.0.0';
|
||||
```
|
||||
|
||||
|
||||
Bun
|
||||
---
|
||||
## Bun
|
||||
|
||||
es-toolkit is also available on Bun. You can install it via the following command:
|
||||
|
||||
```sh
|
||||
bun add es-toolkit
|
||||
```
|
||||
```
|
||||
|
@ -1,13 +1,11 @@
|
||||
About es-toolkit
|
||||
===============
|
||||
# About es-toolkit
|
||||
|
||||
es-toolkit is a modern JavaScript utility library that offers a collection of powerful functions for everyday use.
|
||||
es-toolkit is a modern JavaScript utility library that offers a collection of powerful functions for everyday use.
|
||||
|
||||
Compared to alternatives like lodash, es-toolkit provides a [significantly smaller bundle size](./bundle-size.md) (up to 97% less) and [2-3 times faster runtime performance](./performance.md). This is achieved through a modern implementation that leverages the latest JavaScript features.
|
||||
|
||||
es-toolkit comes with built-in TypeScript types and has been rigorously tested, ensuring 100% test coverage for maximum reliability.
|
||||
|
||||
|
||||
## Features
|
||||
|
||||
Here are some of the features es-toolkit offers:
|
||||
@ -23,4 +21,4 @@ Here are some of the features es-toolkit offers:
|
||||
|
||||
Please refer to the following links for more information about this project.
|
||||
|
||||
- [GitHub](https://github.com/toss/es-toolkit)
|
||||
- [GitHub](https://github.com/toss/es-toolkit)
|
||||
|
@ -1,8 +1,8 @@
|
||||
---
|
||||
description: es-toolkit이 가지는 작은 번들 사이즈
|
||||
---
|
||||
번들 사이즈
|
||||
============
|
||||
|
||||
# 번들 사이즈
|
||||
|
||||
![es-toolkit과 lodash의 번들 사이즈를 비교하는 그래프. es-toolkit이 최대 97% 작은 번들 사이즈를 가진다.](/assets/bundle-size.png)
|
||||
|
||||
@ -12,13 +12,12 @@ es-toolkit은 현대적인 구현을 가지고 있기 때문에, 다른 라이
|
||||
|
||||
## 번들 사이즈 비교
|
||||
|
||||
| | es-toolkit@0.0.1 | lodash-es@4.17.21 | 차이 |
|
||||
|-----------------------------------------------|------------------|--------------------|------------|
|
||||
| [sample](./reference/array/sample.md) | 88 bytes | 2000 bytes | -95.6% |
|
||||
| [difference](./reference/array/difference.md) | 91 bytes | 3190 bytes | -97.2% |
|
||||
| [sum](./reference/math/sum.md) | 152 bytes | 413 bytes | -63.2% |
|
||||
| [debounce](./reference/function/debounce.md) | 144 bytes | 1400 bytes | -89.7% |
|
||||
| [throttle](./reference/function/throttle.md) | 110 bytes | 1460 bytes | -92.5% |
|
||||
| [pick](./reference/object/pick.md) | 657 bytes | 3860 bytes | -83.0% |
|
||||
| [zip](./reference/array/zip.md) | 797 bytes | 1790 bytes | -55.5% |
|
||||
|
||||
| | es-toolkit@0.0.1 | lodash-es@4.17.21 | 차이 |
|
||||
| --------------------------------------------- | ---------------- | ----------------- | ------ |
|
||||
| [sample](./reference/array/sample.md) | 88 bytes | 2000 bytes | -95.6% |
|
||||
| [difference](./reference/array/difference.md) | 91 bytes | 3190 bytes | -97.2% |
|
||||
| [sum](./reference/math/sum.md) | 152 bytes | 413 bytes | -63.2% |
|
||||
| [debounce](./reference/function/debounce.md) | 144 bytes | 1400 bytes | -89.7% |
|
||||
| [throttle](./reference/function/throttle.md) | 110 bytes | 1460 bytes | -92.5% |
|
||||
| [pick](./reference/object/pick.md) | 657 bytes | 3860 bytes | -83.0% |
|
||||
| [zip](./reference/array/zip.md) | 797 bytes | 1790 bytes | -55.5% |
|
||||
|
@ -3,9 +3,9 @@
|
||||
layout: home
|
||||
|
||||
hero:
|
||||
name: "es-toolkit"
|
||||
text: "현대적인 JavaScript 유틸리티 라이브러리"
|
||||
# tagline:
|
||||
name: 'es-toolkit'
|
||||
text: '현대적인 JavaScript 유틸리티 라이브러리'
|
||||
# tagline:
|
||||
actions:
|
||||
- theme: brand
|
||||
text: es-toolkit 알아보기
|
||||
@ -29,4 +29,3 @@ features:
|
||||
- title: 테스트 커버리지 100%
|
||||
details: 모든 함수와 분기에 대해서 꼼꼼하게 테스트가 작성되어 있어요.
|
||||
---
|
||||
|
||||
|
@ -7,14 +7,13 @@ next:
|
||||
text: 번들 사이즈에 미치는 영향
|
||||
link: ./bundle-size
|
||||
---
|
||||
설치
|
||||
============
|
||||
|
||||
# 설치
|
||||
|
||||
Node.js나 Bun을 사용하는 경우, [npm](https://npmjs.com/package/es-toolkit)에서 설치할 수 있어요. Deno에서는 [JSR](https://jsr.io/es-toolkit)에서 설치할 수 있어요.
|
||||
|
||||
## Node.js
|
||||
|
||||
Node.js
|
||||
---
|
||||
es-toolkit은 Node.js 18 또는 이후 버전을 지원해요. es-toolkit을 설치하기 위해서는 아래 명령어를 사용해주세요.
|
||||
|
||||
```sh
|
||||
@ -23,9 +22,7 @@ yarn add es-toolkit
|
||||
pnpm install es-toolkit
|
||||
```
|
||||
|
||||
|
||||
Deno
|
||||
----
|
||||
## Deno
|
||||
|
||||
es-toolkit은 Deno도 지원해요. `npm:`을 이용해서 사용하세요.
|
||||
|
||||
@ -33,12 +30,10 @@ es-toolkit은 Deno도 지원해요. `npm:`을 이용해서 사용하세요.
|
||||
import { chunk } from 'npm:es-toolkit@1.0.0';
|
||||
```
|
||||
|
||||
|
||||
Bun
|
||||
---
|
||||
## Bun
|
||||
|
||||
es-toolkit은 Bun에서도 사용할 수 있어요. 아래 명령어를 사용해주세요.
|
||||
|
||||
```sh
|
||||
bun add es-toolkit
|
||||
```
|
||||
```
|
||||
|
@ -1,5 +1,4 @@
|
||||
es-toolkit 소개
|
||||
===============
|
||||
# es-toolkit 소개
|
||||
|
||||
es-toolkit은 일상적인 개발에서 사용하는 다양한 함수들을 모은 현대적인 JavaScript 유틸리티 라이브러리예요.
|
||||
|
||||
@ -8,7 +7,6 @@ es-toolkit은 일상적인 개발에서 사용하는 다양한 함수들을 모
|
||||
|
||||
es-toolkit은 견고한 TypeScript 타입을 내장하여 제공하며, 신뢰성을 높일 수 있도록 100% 테스트 커버리지를 목표로 하고 있습니다.
|
||||
|
||||
|
||||
## 제공하는 기능
|
||||
|
||||
es-toolkit이 제공하는 기능 목록은 다음과 같습니다.
|
||||
@ -24,4 +22,4 @@ es-toolkit이 제공하는 기능 목록은 다음과 같습니다.
|
||||
|
||||
이 프로젝트에 대해서 더 많은 정보를 얻기 위해서는 아래 링크를 참고하세요.
|
||||
|
||||
- [GitHub](https://github.com/toss/es-toolkit)
|
||||
- [GitHub](https://github.com/toss/es-toolkit)
|
||||
|
@ -1,27 +1,27 @@
|
||||
---
|
||||
description: es-toolkit과 다른 라이브러리의 성능 차이
|
||||
---
|
||||
성능
|
||||
============
|
||||
|
||||
# 성능
|
||||
|
||||
![es-toolkit과 lodash 사이의 성능 차이를 보여주는 그래프. es-toolkit은 lodash를 쓸 때보다 최대 11배 높은 성능을 보여요.](/assets/performance.png)
|
||||
|
||||
es-toolkit은 설계할 때 성능을 우선적으로 고려하고 있어요. lodash와 같은 다른 라이브러리와 비교했을 때, 평균적으로 2배의 성능 향상을 확인할 수 있었어요. 함수에 따라서는 11배 빠른 성능을 보이기도 했죠.
|
||||
es-toolkit은 설계할 때 성능을 우선적으로 고려하고 있어요. lodash와 같은 다른 라이브러리와 비교했을 때, 평균적으로 2배의 성능 향상을 확인할 수 있었어요. 함수에 따라서는 11배 빠른 성능을 보이기도 했죠.
|
||||
현대적인 JavaScript API을 이용하여 구현했기 때문이에요.
|
||||
|
||||
## 성능 비교
|
||||
|
||||
| | es-toolkit@0.0.1 | lodash-es@4.17.21 | 차이 |
|
||||
|-----------------------------------------------------------|------------------|------------------|------------|
|
||||
| [omit](./reference/object/omit.md) | 4,767,360회 | 403,624회 | 11.8× |
|
||||
| [pick](./reference/object/pick.md) | 9,121,839회 | 2,663,072회 | 3.43× |
|
||||
| [differenceWith](./reference/array/differenceWith.md) | 9,291,897회 | 4,275,222회 | 2.17× |
|
||||
| [difference](./reference/array/difference.md) | 10,436,101회 | 5,155,631회 | 2.02× |
|
||||
| [intersectionWith](./reference/array/intersectionWith.md) | 8,074,722회 | 3,814,479회 | 2.12× |
|
||||
| [intersection](./reference/array/intersection.md) | 9,999,571회 | 4,630,316회 | 2.15× |
|
||||
| [unionBy](./reference/array/unionBy.md) | 6,435,983회 | 3,794,899회 | 1.69× |
|
||||
| [union](./reference/array/union.md) | 5,059,209회 | 4,771,400회 | 1.06× |
|
||||
| [dropRightWhile](./reference/array/dropRightWhile.md) | 7,529,559회 | 5,606,439회 | 1.34× |
|
||||
| [groupBy](./reference/array/groupBy.md) | 5,000,235회 | 5,206,286회 | 0.96× |
|
||||
| | es-toolkit@0.0.1 | lodash-es@4.17.21 | 차이 |
|
||||
| --------------------------------------------------------- | ---------------- | ----------------- | ----- |
|
||||
| [omit](./reference/object/omit.md) | 4,767,360회 | 403,624회 | 11.8× |
|
||||
| [pick](./reference/object/pick.md) | 9,121,839회 | 2,663,072회 | 3.43× |
|
||||
| [differenceWith](./reference/array/differenceWith.md) | 9,291,897회 | 4,275,222회 | 2.17× |
|
||||
| [difference](./reference/array/difference.md) | 10,436,101회 | 5,155,631회 | 2.02× |
|
||||
| [intersectionWith](./reference/array/intersectionWith.md) | 8,074,722회 | 3,814,479회 | 2.12× |
|
||||
| [intersection](./reference/array/intersection.md) | 9,999,571회 | 4,630,316회 | 2.15× |
|
||||
| [unionBy](./reference/array/unionBy.md) | 6,435,983회 | 3,794,899회 | 1.69× |
|
||||
| [union](./reference/array/union.md) | 5,059,209회 | 4,771,400회 | 1.06× |
|
||||
| [dropRightWhile](./reference/array/dropRightWhile.md) | 7,529,559회 | 5,606,439회 | 1.34× |
|
||||
| [groupBy](./reference/array/groupBy.md) | 5,000,235회 | 5,206,286회 | 0.96× |
|
||||
|
||||
테스트 환경은 MacBook Pro 14인치(M1 Max, 2021)예요. [벤치마크 코드](https://github.com/toss/es-toolkit/tree/main/benchmarks)를 참고하세요.
|
||||
테스트 환경은 MacBook Pro 14인치(M1 Max, 2021)예요. [벤치마크 코드](https://github.com/toss/es-toolkit/tree/main/benchmarks)를 참고하세요.
|
||||
|
@ -5,7 +5,6 @@
|
||||
입력값으로 배열을 받아서, 정해진 길이를 따르는 더 작은 배열 여러 개로 나눠요.
|
||||
입력 배열이 똑같은 길이로 나눠질 수 없다면, 나눠진 마지막 배열이 남은 요소들을 포함하게 돼요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
@ -37,4 +36,4 @@ chunk([1, 2, 3, 4, 5], 2);
|
||||
// 문자열의 배열을 최대 3의 길이를 가지는 더 작은 배열들로 쪼개요.
|
||||
chunk(['a', 'b', 'c', 'd', 'e', 'f', 'g'], 3);
|
||||
// Returns: [['a', 'b', 'c'], ['d', 'e', 'f'], ['g']]
|
||||
```
|
||||
```
|
||||
|
@ -2,10 +2,9 @@
|
||||
|
||||
두 배열의 차이를 계산해요.
|
||||
|
||||
이 함수는 파라미터로 두 배열을 받아서, 첫 번째 배열에 있지만 두 번째 배열에는 없는 요소들을 포함한 새로운 배열을 반환해요.
|
||||
이 함수는 파라미터로 두 배열을 받아서, 첫 번째 배열에 있지만 두 번째 배열에는 없는 요소들을 포함한 새로운 배열을 반환해요.
|
||||
즉, 첫 번째 배열에서 두 번째 배열에 있는 요소들을 제외한 나머지 요소들로 구성된 배열을 만들어줘요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
@ -17,8 +16,6 @@ function difference<T>(firstArr: T[], secondArr: T[]): T[];
|
||||
- `firstArr` (`T[]`): 차이를 계산할 배열이에요. 이 배열이 주 배열이고, 이 배열의 요소들이 비교되고 필터링돼요.
|
||||
- `secondArr` (`T[]`): 첫 번째 배열에서 제외할 요소들을 포함한 배열이에요. 이 배열의 각 요소는 첫 번째 배열과 비교되며, 일치하는 요소가 있으면 결과에서 제외돼요.
|
||||
|
||||
|
||||
|
||||
### 반환 값
|
||||
|
||||
(`T[]`): 첫 번째 배열에는 있지만 두 번째 배열에는 없는 요소들이 담긴 새로운 배열이에요.
|
||||
|
@ -7,7 +7,7 @@
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function differenceBy<T, U>(firstArr: T[], secondArr: T[], mapper: (value: T) => U): T[]
|
||||
function differenceBy<T, U>(firstArr: T[], secondArr: T[], mapper: (value: T) => U): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
|
@ -7,7 +7,7 @@
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function differenceWith<T>(firstArr: T[], secondArr: T[], areItemsEqual: (x: T, y: T) => boolean): T[]
|
||||
function differenceWith<T>(firstArr: T[], secondArr: T[], areItemsEqual: (x: T, y: T) => boolean): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
@ -17,8 +17,8 @@ function differenceWith<T>(firstArr: T[], secondArr: T[], areItemsEqual: (x: T,
|
||||
- `areItemsEqual` (`(x: T, y: T) => boolean`): 두 요소가 동일한지 결정할 함수에요.
|
||||
|
||||
### 반환 값
|
||||
(`T[]`) 비교 함수에 따라 첫 번째 배열에는 있지만 두 번째 배열에는 존재하지 않는다고 결정된 요소들이 담긴 새로운 배열이에요.
|
||||
|
||||
(`T[]`) 비교 함수에 따라 첫 번째 배열에는 있지만 두 번째 배열에는 존재하지 않는다고 결정된 요소들이 담긴 새로운 배열이에요.
|
||||
|
||||
## 예시
|
||||
|
||||
|
@ -2,16 +2,16 @@
|
||||
|
||||
배열의 끝부터 시작해서, 조건 함수가 `false`를 반환할 때까지 요소들을 제거해요.
|
||||
|
||||
이 함수는 각 배열의 요소를 순회하면서, 배열의 끝부터 조건 함수가 `false`를 반환할 때까지 요소를 제거해요.
|
||||
이 함수는 각 배열의 요소를 순회하면서, 배열의 끝부터 조건 함수가 `false`를 반환할 때까지 요소를 제거해요.
|
||||
남은 요소들로 구성된 새로운 배열을 반환해요.
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function dropRightWhile<T>(arr: T[], canContinueDropping: (item: T) => boolean): T[]
|
||||
function dropRightWhile<T>(arr: T[], canContinueDropping: (item: T) => boolean): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 요소를 제거할 배열.
|
||||
- `canContinueDropping` (`(item: T) => boolean`): 요소를 제거하는 것을 계속할지 반환하는 조건 함수예요. 각 요소에 대해서 호출되면서, `true`를 반환하는 동안 요소를 제거해요.
|
||||
|
@ -2,17 +2,16 @@
|
||||
|
||||
배열의 처음부터 시작해서, 조건 함수가 `false`를 반환할 때까지 요소들을 제거해요.
|
||||
|
||||
이 함수는 각 배열의 요소를 순회하면서, 배열의 시작부터 조건 함수가 `false`를 반환할 때까지 요소를 제거해요.
|
||||
이 함수는 각 배열의 요소를 순회하면서, 배열의 시작부터 조건 함수가 `false`를 반환할 때까지 요소를 제거해요.
|
||||
남은 요소들로 구성된 새로운 배열을 반환해요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function dropWhile<T>(arr: T[], canContinueDropping: (item: T) => boolean): T[]
|
||||
function dropWhile<T>(arr: T[], canContinueDropping: (item: T) => boolean): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 요소를 제거할 배열.
|
||||
- `canContinueDropping` (`(item: T) => boolean`): 요소를 제거하는 것을 계속할지 반환하는 조건 함수예요. 각 요소에 대해서 호출되면서, `true`를 반환하는 동안 요소를 제거해요.
|
||||
|
@ -11,7 +11,7 @@
|
||||
function groupBy<T, K extends string>(arr: T[], getKeyFromItem: (item: T) => K): Record<K, T[]>;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 요소를 분류할 배열.
|
||||
- `getKeyFromItem` (`(item: T) => K`): 요소에서 키를 생성하는 함수.
|
||||
@ -26,7 +26,7 @@ function groupBy<T, K extends string>(arr: T[], getKeyFromItem: (item: T) => K):
|
||||
const array = [
|
||||
{ category: 'fruit', name: 'apple' },
|
||||
{ category: 'fruit', name: 'banana' },
|
||||
{ category: 'vegetable', name: 'carrot' }
|
||||
{ category: 'vegetable', name: 'carrot' },
|
||||
];
|
||||
const result = groupBy(array, item => item.category);
|
||||
// 결괏값:
|
||||
|
@ -2,17 +2,16 @@
|
||||
|
||||
두 배열 모두에 포함되어 있는 요소를 반환해요.
|
||||
|
||||
이 함수는 두 개의 배열을 받고, 두 배열 모두에 포함되어 있는 요소로 구성된 새로운 배열을 반환해요.
|
||||
이 함수는 두 개의 배열을 받고, 두 배열 모두에 포함되어 있는 요소로 구성된 새로운 배열을 반환해요.
|
||||
실제로는 첫 번째 배열의 요소들 중에서 두 번째 배열에 포함되어 있지 않은 요소들을 제거해요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function intersection<T>(firstArr: T[], secondArr: T[]): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `firstArr` (`T[]`): 비교할 첫 번째 배열.
|
||||
- `secondArr` (`T[]`): 비교할 두 번째 배열.
|
||||
@ -21,7 +20,6 @@ function intersection<T>(firstArr: T[], secondArr: T[]): T[];
|
||||
|
||||
(`T[]`) 두 배열 모두에 포함되어 있는 요소로 구성된 새로운 배열.
|
||||
|
||||
|
||||
## 예시
|
||||
|
||||
```typescript
|
||||
|
@ -2,19 +2,17 @@
|
||||
|
||||
`mapper` 함수가 반환하는 값을 기준으로, 두 배열의 교집합을 반환해요.
|
||||
|
||||
이 함수는 파라미터로 두 개의 배열과 `mapper` 함수를 받아요.
|
||||
이 함수는 파라미터로 두 개의 배열과 `mapper` 함수를 받아요.
|
||||
`mapper` 함수로 각 배열의 요소들을 변환했을 때, 두 배열에 모두 포함되는 요소들로 이루어진 새로운 배열을 반환해요.
|
||||
실제 구현을 살펴보면, 첫 번째 배열과 두 번째 배열을 `mapper` 가 반환하는 값을 기준으로 비교하여, 첫 번째 배열의 요소들 중 두 번째 배열에 없는 요소들을 제거해요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function intersectionBy<T, U>(firstArr: T[], secondArr: T[], mapper: (item: T) => U): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
|
||||
### 파라미터
|
||||
|
||||
- `firstArr` (`T[]`): 비교할 첫 번째 배열.
|
||||
- `secondArr` (`T[]`): 비교할 두 번째 배열.
|
||||
@ -24,7 +22,6 @@ function intersectionBy<T, U>(firstArr: T[], secondArr: T[], mapper: (item: T) =
|
||||
|
||||
(`T[]`): 첫 번째 배열과 두 번째 배열을 `mapper` 가 반환하는 값을 기준으로 비교하여, 두 배열 모두에 포함되는 요소들만 포함하는 새로운 배열.
|
||||
|
||||
|
||||
## 예시
|
||||
|
||||
```typescript
|
||||
|
@ -12,7 +12,7 @@
|
||||
function intersectionWith<T>(firstArr: T[], secondArr: T[], areItemsEqual: (x: T, y: T) => boolean): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `firstArr` (`T[]`): 비교할 첫 번째 배열.
|
||||
- `secondArr` (`T[]`): 비교할 두 번째 배열.
|
||||
@ -22,7 +22,6 @@ function intersectionWith<T>(firstArr: T[], secondArr: T[], areItemsEqual: (x: T
|
||||
|
||||
(`T[]`): 커스텀 일치 함수의 반환 값을 기준으로, 두 배열에 모두 포함된 요소들을 포함하는 새로운 배열.
|
||||
|
||||
|
||||
## 예시
|
||||
|
||||
```typescript
|
||||
|
@ -12,7 +12,7 @@
|
||||
function partition<T>(arr: T[], isInTruthy: (value: T) => boolean): [truthy: T[], falsy: T[]];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 2개로 나눌 배열.
|
||||
- `isInTruthy` (`(value: T) => boolean`): 배열의 요소가 첫 번째 배열에 포함될지, 두 번째 배열에 포함될지 결정하는 함수. `true`를 반환하면 첫 번째 배열에, `false`를 반환하면 두 번째 배열에 포함돼요.
|
||||
@ -28,4 +28,4 @@ const array = [1, 2, 3, 4, 5];
|
||||
const is짝수 = x => x % 2 === 0;
|
||||
const [짝수, 홀수] = partition(array, is짝수);
|
||||
// 짝수는 [2, 4], 홀수는 [1, 3, 5]가 되어요.
|
||||
```
|
||||
```
|
||||
|
@ -8,7 +8,7 @@
|
||||
function sample<T>(arr: T[]): T;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 샘플링할 배열이에요.
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
function shuffle<T>(arr: T[]): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 요소를 뒤섞을 배열이에요.
|
||||
|
||||
@ -22,4 +22,4 @@ function shuffle<T>(arr: T[]): T[];
|
||||
const array = [1, 2, 3, 4, 5];
|
||||
const shuffledArray = shuffle(array);
|
||||
// shuffledArray는 배열의 요소들이 무작위로 섞인 새로운 배열인 [3, 1, 4, 5, 2]이 되어요.
|
||||
```
|
||||
```
|
||||
|
@ -4,14 +4,13 @@
|
||||
|
||||
만약 count가 arr의 길이보다 크면, 전체 배열을 반환해요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function take<T>(arr: T[], count: number): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 요소를 가져올 배열이에요.
|
||||
- `count` (`number`): 가져올 요소의 개수예요.
|
||||
@ -31,4 +30,4 @@ take(['a', 'b', 'c'], 2);
|
||||
|
||||
// [1, 2, 3]
|
||||
take([1, 2, 3], 5);
|
||||
```
|
||||
```
|
||||
|
@ -4,22 +4,20 @@
|
||||
|
||||
만약 `count`가 `arr`의 길이보다 크면, 전체 배열을 반환해요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function takeRight<T>(arr: T[], count: number): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 요소를 가져올 배열이에요.
|
||||
- `count` (`number`): 가져올 요소의 개수예요.
|
||||
|
||||
### 반환 값
|
||||
|
||||
(`T[]`) `arr` 에서 마지막 `count` 개의 요소를 포함하는 새로운 배열이에요.
|
||||
|
||||
(`T[]`) `arr` 에서 마지막 `count` 개의 요소를 포함하는 새로운 배열이에요.
|
||||
|
||||
## 예시
|
||||
|
||||
@ -32,4 +30,4 @@ takeRight(['a', 'b', 'c'], 2);
|
||||
|
||||
// [1, 2, 3]
|
||||
takeRight([1, 2, 3], 5);
|
||||
```
|
||||
```
|
||||
|
@ -6,10 +6,10 @@
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function takeRightWhile<T>(arr: T[], shouldContinueTaking: (item: T) => boolean): T[]
|
||||
function takeRightWhile<T>(arr: T[], shouldContinueTaking: (item: T) => boolean): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 요소를 가져올 배열이에요.
|
||||
- `shouldContinueTaking` (`(item: T) => boolean`): 각 요소와 함께 호출되는 조건 함수예요. 이 함수가 `true`를 반환하는 동안 요소들이 결과에 포함돼요.
|
||||
@ -18,7 +18,6 @@ function takeRightWhile<T>(arr: T[], shouldContinueTaking: (item: T) => boolean)
|
||||
|
||||
(`T[]`): 조건 함수가 `true`를 반환하는 동안 배열의 끝에서부터 가져온 요소들을 포함하는 새로운 배열이에요.
|
||||
|
||||
|
||||
## 예시
|
||||
|
||||
```typescript
|
||||
@ -27,4 +26,4 @@ takeRightWhile([5, 4, 3, 2, 1], n => n < 4);
|
||||
|
||||
// []
|
||||
takeRightWhile([1, 2, 3], n => n > 3);
|
||||
```
|
||||
```
|
||||
|
@ -1,16 +1,15 @@
|
||||
# takeWhile
|
||||
|
||||
주어진 조건 함수가 `true`를 반환하는 선행 요소들을 포함하는 새로운 배열을 반환해요.
|
||||
주어진 조건 함수가 `true`를 반환하는 선행 요소들을 포함하는 새로운 배열을 반환해요.
|
||||
조건을 만족하지 않는 요소가 나오면 멈춰요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function takeWhile<T>(arr: T[], shouldContinueTaking: (element: T) => boolean): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 요소를 가져올 배열이에요.
|
||||
- `shouldContinueTaking` (`(item: T) => boolean`) 각 요소와 함께 호출되는 조건 함수예요. 이 함수가 `true`를 반환하는 동안 요소들이 결과에 포함돼요.
|
||||
@ -19,7 +18,6 @@ function takeWhile<T>(arr: T[], shouldContinueTaking: (element: T) => boolean):
|
||||
|
||||
(`T[]`) 조건 함수가 `true`를 반환하는 동안 처음부터 가져온 요소들을 포함하는 새로운 배열이에요.
|
||||
|
||||
|
||||
## 예시
|
||||
|
||||
```typescript
|
||||
@ -28,4 +26,4 @@ takeWhile([1, 2, 3, 4], x => x < 3);
|
||||
|
||||
// Returns []
|
||||
takeWhile([1, 2, 3, 4], x => x > 3);
|
||||
```
|
||||
```
|
||||
|
@ -2,14 +2,13 @@
|
||||
|
||||
`mapper` 함수가 반환하는 값을 기준으로, 두 배열의 합집합을 반환해요.
|
||||
|
||||
이 함수는 파라미터로 두 개의 배열과 `mapper` 함수를 받아요.
|
||||
이 함수는 파라미터로 두 개의 배열과 `mapper` 함수를 받아요.
|
||||
`mapper` 함수로 두 배열의 요소들을 변환했을 때, 두 배열에 모두 포함되는 요소는 제거돼요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function unionBy<T, U>(arr1: T[], arr2: T[], mapper: (item: T) => U): T[]
|
||||
function unionBy<T, U>(arr1: T[], arr2: T[], mapper: (item: T) => U): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
|
@ -17,7 +17,6 @@ function unionWith<T>(arr1: T[], arr2: T[], areItemsEqual: (item1: T, item2: T)
|
||||
- `arr2` (`T[]`): 비교할 두 번째 배열.
|
||||
- `areItemsEqual` (`(x: T, y: T) => boolean`): 두 요소가 일치하는지 판단하는 일치 함수예요. 두 요소가 일치한다면 `true`를, 일치하지 않는다면 `false`를 반환하게 해주세요.
|
||||
|
||||
|
||||
### 반환 값
|
||||
|
||||
(`T[]`): 커스텀 일치 함수의 반환 값을 기준으로, 두 배열의 합집합을 나타내는 새로운 배열.
|
||||
|
@ -10,7 +10,7 @@
|
||||
function uniq<T>(arr: T[]): T[];
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `arr` (`T[]`): 요소들의 중복을 제거할 배열이에요.
|
||||
|
||||
@ -24,3 +24,4 @@ function uniq<T>(arr: T[]): T[];
|
||||
const array = [1, 2, 2, 3, 4, 4, 5];
|
||||
const result = uniq(array);
|
||||
// result는 [1, 2, 3, 4, 5]가 될 거예요.
|
||||
```
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
`mapper` 함수가 반환하는 값을 기준으로, 두 배열의 대칭 차집합을 반환해요.
|
||||
|
||||
이 함수는 파라미터로 두 개의 배열과 `mapper` 함수를 받아요.
|
||||
이 함수는 파라미터로 두 개의 배열과 `mapper` 함수를 받아요.
|
||||
`mapper` 함수로 두 배열의 요소들을 변환했을 때, 두 배열 중 하나에는 있지만 교집합에는 없는 요소들로 이루어진 새 배열을 반환해요.
|
||||
|
||||
## 인터페이스
|
||||
|
@ -1,7 +1,7 @@
|
||||
# debounce
|
||||
|
||||
제공된 함수를 호출하는 것을 지연시키는 debounce된 함수를 생성해요.
|
||||
debounce된 함수는 마지막으로 호출된 후, `debounceMs` 밀리초가 경과해야 호출돼요.
|
||||
제공된 함수를 호출하는 것을 지연시키는 debounce된 함수를 생성해요.
|
||||
debounce된 함수는 마지막으로 호출된 후, `debounceMs` 밀리초가 경과해야 호출돼요.
|
||||
debounce된 함수는 또한 대기 중인 실행을 취소하는 `cancel` 메서드를 가지고 있어요.
|
||||
|
||||
## 인터페이스
|
||||
@ -10,7 +10,7 @@ debounce된 함수는 또한 대기 중인 실행을 취소하는 `cancel` 메
|
||||
function debounce(func: () => void, debounceMs: number): { (): void; cancel: () => void };
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `func` (`() => void`): debounce된 함수를 만들 함수.
|
||||
- `debounceMs`(`number`): debounce로 지연시킬 밀리초.
|
||||
@ -19,7 +19,6 @@ function debounce(func: () => void, debounceMs: number): { (): void; cancel: ()
|
||||
|
||||
(`{ (): void; cancel: () => void }`): `cancel` 메서드를 가지고 있는 debounce된 함수.
|
||||
|
||||
|
||||
## 예시
|
||||
|
||||
```typescript
|
||||
|
@ -3,12 +3,11 @@
|
||||
제공된 함수 `func`를 한 번만 호출하도록 제한하는 함수를 생성해요.
|
||||
함수를 반복해서 호출하면 첫 번째 호출의 값을 반환해요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
function once<F extends () => any>(func: F): F;
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `func` (`F extends () => any`): 한 번만 호출하도록 제한할 함수예요.
|
||||
|
||||
@ -16,7 +15,6 @@ function once<F extends () => any>(func: F): F;
|
||||
|
||||
(`F`): `func`가 한 번 호출되면 결과를 캐시하고 반환할 새로운 함수예요.
|
||||
|
||||
|
||||
## 예시
|
||||
|
||||
```typescript
|
||||
|
@ -2,14 +2,12 @@
|
||||
|
||||
제공된 함수를 매 `throttleMs` 밀리초마다 최대 한 번만 호출하는 throttle된 함수를 생성해요. 시간 안에 throttle된 함수를 다시 호출해도 원래 함수를 실행하지 않아요.
|
||||
|
||||
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function throttle(func: () => void, throttleMs: number): () => void;
|
||||
```
|
||||
|
||||
|
||||
### 파라미터
|
||||
|
||||
- `func` (`() => void`): throttle할 함수.
|
||||
@ -19,7 +17,6 @@ function throttle(func: () => void, throttleMs: number): () => void;
|
||||
|
||||
(`() => void`): 새로운 throttle된 함수.
|
||||
|
||||
|
||||
## 예시
|
||||
|
||||
```typescript
|
||||
@ -37,4 +34,4 @@ throttledFunction();
|
||||
setTimeout(() => {
|
||||
throttledFunction(); // '호출'를 로깅해요
|
||||
}, 1000);
|
||||
```
|
||||
```
|
||||
|
@ -12,7 +12,7 @@ function clamp(value: number, maximum: number): number;
|
||||
function clamp(value: number, minimum: number, maximum: number): number;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `value` (`number`): 고정할 숫자에요.
|
||||
- `minimum` (`number`): 숫자를 고정할 최솟값이에요.
|
||||
@ -20,7 +20,7 @@ function clamp(value: number, minimum: number, maximum: number): number;
|
||||
|
||||
### 반환 값
|
||||
|
||||
(`number`): 지정된 범위 내에서 고정된 숫자를 반환해요.
|
||||
(`number`): 지정된 범위 내에서 고정된 숫자를 반환해요.
|
||||
|
||||
## 예시
|
||||
|
||||
@ -29,4 +29,4 @@ const result1 = clamp(10, 5); // 범위가 5로 고정되기 때문에 result1
|
||||
const result2 = clamp(10, 5, 15); // 10은 5와 15의 범위 내에 있기 때문에 result2는 10이 되어요.
|
||||
const result3 = clamp(2, 5, 15); // 최소값이 5이기 때문에 result3는 5가 되어요.
|
||||
const result4 = clamp(20, 5, 15); // 최대값이 15이기 때문에 result4는 15가 되어요.
|
||||
```
|
||||
```
|
||||
|
@ -10,7 +10,7 @@
|
||||
function round(value: number, precision?: number): number;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `value` (`number`): 반올림할 숫자에요.
|
||||
- `precision` (`number`, optional): 반올림할 소수점 자릿수에요. 기본값은 0이에요.
|
||||
|
@ -10,7 +10,7 @@
|
||||
function sum(nums: number[]): number;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `nums` (`number[]`): 합계를 계산할 숫자 배열이에요.
|
||||
|
||||
@ -24,4 +24,4 @@ function sum(nums: number[]): number;
|
||||
const numbers = [1, 2, 3, 4, 5];
|
||||
const result = sum(numbers);
|
||||
// result는 15가 되어요.
|
||||
```
|
||||
```
|
||||
|
@ -10,7 +10,7 @@
|
||||
function omit<T, K extends keyof T>(obj: T, keys: K[]): Omit<T, K>;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `obj` (`T`): 키를 생략할 객체예요.
|
||||
- `keys` (`K[]`): 객체에서 생략할 키들의 배열이에요.
|
||||
|
@ -10,7 +10,7 @@
|
||||
function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `obj` (`T`): 키를 선택할 객체예요.
|
||||
- `keys` (`K[]`): 객체에서 선택할 키들의 배열이에요.
|
||||
|
@ -7,10 +7,13 @@
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function pickBy<T extends Record<string, any>>(obj: T, shouldPick: (value: T[keyof T], key: string) => boolean): Partial<T>;
|
||||
function pickBy<T extends Record<string, any>>(
|
||||
obj: T,
|
||||
shouldPick: (value: T[keyof T], key: string) => boolean
|
||||
): Partial<T>;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `obj` (`T`): 프로퍼티를 선택할 객체예요.
|
||||
- `shouldPick` (`(value: T[keyof T], key: string) => boolean`): 프로퍼티를 선택할지를 결정하는 조건 함수예요. 이 함수는 프로퍼티의 키와 값을 인수로 받아, 프로퍼티를 선택해야 하면 true, 그렇지 않으면 false를 반환해요.
|
||||
@ -26,4 +29,4 @@ const obj = { a: 1, b: 'pick', c: 3 };
|
||||
const shouldPick = (value, key) => typeof value === 'string';
|
||||
const result = pickBy(obj, shouldPick);
|
||||
// 결과는 다음과 같아요 { b: 'pick' }
|
||||
```
|
||||
```
|
||||
|
@ -1,4 +1,4 @@
|
||||
# isNil
|
||||
# isNil
|
||||
|
||||
주어진 값이 null이나 undefined인지 확인해요.
|
||||
|
||||
@ -9,10 +9,9 @@ TypeScript의 타입 가드로 주로 사용되는데요, 파라미터로 주어
|
||||
## 인터페이스
|
||||
|
||||
```typescript
|
||||
function isNil(x: unknown): x is null | undefined
|
||||
function isNil(x: unknown): x is null | undefined;
|
||||
```
|
||||
|
||||
|
||||
## 예시
|
||||
|
||||
```typescript
|
||||
@ -24,4 +23,4 @@ const value3 = 42;
|
||||
const result1 = isNil(value1); // true
|
||||
const result2 = isNil(value2); // true
|
||||
const result3 = isNil(value3); // false
|
||||
```
|
||||
```
|
||||
|
@ -12,7 +12,7 @@ TypeScript의 타입 가드로 주로 사용되는데요, 파라미터로 주어
|
||||
function isNotNil<T>(x: T | null | undefined): x is T;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `x` (`T | null | undefined`): 값null이나 undefined가 아님을 확인할 값.
|
||||
|
||||
@ -28,4 +28,4 @@ const arr = [1, undefined, 3];
|
||||
// `result`의 타입은 number[] 예요
|
||||
const result = arr.filter(isNotNil);
|
||||
// `result` 값은 [1, 3]이 되어요
|
||||
```
|
||||
```
|
||||
|
@ -13,7 +13,7 @@ TypeScript의 타입 가드로 주로 사용되는데요, 파라미터로 주어
|
||||
function isNull(x: unknown): x is null;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `x` (`unknown`): null인지 확인할 값
|
||||
|
||||
@ -31,4 +31,4 @@ const value3 = 42;
|
||||
console.log(isNull(value1)); // true
|
||||
console.log(isNull(value2)); // false
|
||||
console.log(isNull(value3)); // false
|
||||
```
|
||||
```
|
||||
|
@ -13,7 +13,7 @@ TypeScript의 타입 가드로 주로 사용되는데요, 파라미터로 주어
|
||||
function isUndefined(x: unknown): x is undefined;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `x` (`unknown`): undefined인지 확인할 값
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
function delay(ms: number): Promise<void>;
|
||||
```
|
||||
|
||||
### 파라미터
|
||||
### 파라미터
|
||||
|
||||
- `ms` (`number`): 코드 실행을 지연시킬 밀리세컨드.
|
||||
|
||||
|
@ -1,27 +1,26 @@
|
||||
---
|
||||
description: The performance difference between es-toolkit and alternative libraries
|
||||
---
|
||||
Performance
|
||||
============
|
||||
|
||||
# Performance
|
||||
|
||||
![Graph showing the difference in performance between es-toolkit and lodash. Using es-toolkit results in a performance gain of up to 11 times.](/assets/performance.png)
|
||||
|
||||
Designed with performance in mind, es-toolkit provides an average of 2× performance improvement compared to alternative libraries like lodash. Some functions achieve up to an 11× performance gain by fully utilizing modern JavaScript APIs.
|
||||
|
||||
|
||||
## Performance Comparison
|
||||
|
||||
| | es-toolkit@0.0.1 | lodash-es@4.17.21 | Difference |
|
||||
|-----------------------------------------------------------|------------------|--------------------|------------|
|
||||
| [omit](./reference/object/omit.md) | 4,767,360 times | 403,624 times | 11.8× |
|
||||
| [pick](./reference/object/pick.md) | 9,121,839 times | 2,663,072 times | 3.43× |
|
||||
| [differenceWith](./reference/array/differenceWith.md) | 9,291,897 times | 4,275,222 times | 2.17× |
|
||||
| [difference](./reference/array/difference.md) | 10,436,101 times | 5,155,631 times | 2.02× |
|
||||
| [intersectionWith](./reference/array/intersectionWith.md) | 8,074,722 times | 3,814,479 times | 2.12× |
|
||||
| [intersection](./reference/array/intersection.md) | 9,999,571 times | 4,630,316 times | 2.15× |
|
||||
| [unionBy](./reference/array/unionBy.md) | 6,435,983 times | 3,794,899 times | 1.69× |
|
||||
| [union](./reference/array/union.md) | 5,059,209 times | 4,771,400 times | 1.06× |
|
||||
| [dropRightWhile](./reference/array/dropRightWhile.md) | 7,529,559 times | 5,606,439 times | 1.34× |
|
||||
| [groupBy](./reference/array/groupBy.md) | 5,000,235 times | 5,206,286 times | 0.96× |
|
||||
| | es-toolkit@0.0.1 | lodash-es@4.17.21 | Difference |
|
||||
| --------------------------------------------------------- | ---------------- | ----------------- | ---------- |
|
||||
| [omit](./reference/object/omit.md) | 4,767,360 times | 403,624 times | 11.8× |
|
||||
| [pick](./reference/object/pick.md) | 9,121,839 times | 2,663,072 times | 3.43× |
|
||||
| [differenceWith](./reference/array/differenceWith.md) | 9,291,897 times | 4,275,222 times | 2.17× |
|
||||
| [difference](./reference/array/difference.md) | 10,436,101 times | 5,155,631 times | 2.02× |
|
||||
| [intersectionWith](./reference/array/intersectionWith.md) | 8,074,722 times | 3,814,479 times | 2.12× |
|
||||
| [intersection](./reference/array/intersection.md) | 9,999,571 times | 4,630,316 times | 2.15× |
|
||||
| [unionBy](./reference/array/unionBy.md) | 6,435,983 times | 3,794,899 times | 1.69× |
|
||||
| [union](./reference/array/union.md) | 5,059,209 times | 4,771,400 times | 1.06× |
|
||||
| [dropRightWhile](./reference/array/dropRightWhile.md) | 7,529,559 times | 5,606,439 times | 1.34× |
|
||||
| [groupBy](./reference/array/groupBy.md) | 5,000,235 times | 5,206,286 times | 0.96× |
|
||||
|
||||
Tested with MacBook Pro 14-inch (M1 Max, 2021). Refer to our [benchmark code](https://github.com/toss/es-toolkit/tree/main/benchmarks).
|
||||
Tested with MacBook Pro 14-inch (M1 Max, 2021). Refer to our [benchmark code](https://github.com/toss/es-toolkit/tree/main/benchmarks).
|
||||
|
@ -6,7 +6,6 @@ This function takes an input array and divides it into multiple smaller arrays,
|
||||
each of a specified length. If the input array cannot be evenly divided,
|
||||
the final sub-array will contain the remaining elements.
|
||||
|
||||
|
||||
## Signature
|
||||
|
||||
```typescript
|
||||
@ -38,4 +37,4 @@ chunk([1, 2, 3, 4, 5], 2);
|
||||
// Splits an array of strings into sub-arrays of length 3
|
||||
chunk(['a', 'b', 'c', 'd', 'e', 'f', 'g'], 3);
|
||||
// Returns: [['a', 'b', 'c'], ['d', 'e', 'f'], ['g']]
|
||||
```
|
||||
```
|
||||
|
@ -2,11 +2,10 @@
|
||||
|
||||
Computes the difference between two arrays.
|
||||
|
||||
This function takes two arrays and returns a new array containing the elements
|
||||
that are present in the first array but not in the second array. It effectively
|
||||
This function takes two arrays and returns a new array containing the elements
|
||||
that are present in the first array but not in the second array. It effectively
|
||||
filters out any elements from the first array that also appear in the second array.
|
||||
|
||||
|
||||
## Signature
|
||||
|
||||
```typescript
|
||||
@ -18,10 +17,9 @@ function difference<T>(firstArr: T[], secondArr: T[]): T[];
|
||||
- `firstArr` (`T[]`): The array from which to derive the difference. This is the primary array from which elements will be compared and filtered.
|
||||
- `secondArr` (`T[]`): The array containing elements to be excluded from the first array. Each element in this array will be checked against the first array, and if a match is found, that element will be excluded from the result.
|
||||
|
||||
|
||||
### Returns
|
||||
|
||||
(`T[]`) A new array containing the elements that are present in the first array but not
|
||||
(`T[]`) A new array containing the elements that are present in the first array but not
|
||||
in the second array.
|
||||
|
||||
## Examples
|
||||
|
@ -2,21 +2,20 @@
|
||||
|
||||
Computes the difference between two arrays after mapping their elements through a provided function.
|
||||
|
||||
This function takes two arrays and a mapper function. It returns a new array containing the elements
|
||||
that are present in the first array but not in the second array, based on the identity calculated
|
||||
by the mapper function. Essentially, it filters out any elements from the first array that, when
|
||||
This function takes two arrays and a mapper function. It returns a new array containing the elements
|
||||
that are present in the first array but not in the second array, based on the identity calculated
|
||||
by the mapper function. Essentially, it filters out any elements from the first array that, when
|
||||
mapped, match an element in the mapped version of the second array.
|
||||
|
||||
|
||||
## Signature
|
||||
|
||||
```typescript
|
||||
function differenceBy<T, U>(firstArr: T[], secondArr: T[], mapper: (value: T) => U): T[]
|
||||
function differenceBy<T, U>(firstArr: T[], secondArr: T[], mapper: (value: T) => U): T[];
|
||||
```
|
||||
|
||||
### Parameters
|
||||
|
||||
- `firstArr` (`T[]`): The primary array from which to derive the difference.
|
||||
- `firstArr` (`T[]`): The primary array from which to derive the difference.
|
||||
- `secondArr` (`T[]`): The array containing elements to be excluded from the first array.
|
||||
- `mapper` (`(value: T) => U`): The function to map the elements of both arrays. This function is applied to each element in both arrays, and the comparison is made based on the mapped values.
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user