Skip to content

helpers4 vs es-toolkit — Detailed Comparison

es-toolkit is a modern, high-performance lodash replacement (~300 functions) maintained by Toss (Viva Republica) — 2-3x faster than lodash, up to 97% smaller per function, with a drop-in es-toolkit/compat layer for migrating existing lodash code. It’s the most actively developed general-purpose utility library in this comparison (last published 2026-07-18, 1,660+ published versions).

This page details the differences to help you decide whether you need helpers4, es-toolkit, or both.

helpers4es-toolkit
GoalGeneral-purpose utilities plus domain-specific helpers other toolkits don’t coverModern, fast, tree-shakable replacement for lodash
ScopeBroad — general-purpose (array, object, string, number, function, guard) plus domain-specific categories (dates, URLs, semver, observables) and Map/Set/concurrency primitivesBroad — array, object, string, math, function, predicates, Map, Set, and Promise utilities
Package strategyIndependent @helpers4/* packages per categorySingle es-toolkit package (tree-shaken per-function at bundle time, not per-package)
DependenciesZero runtime dependenciesZero dependencies
LicenseLGPL-3.0MIT
BackingSolo-maintainedToss (Viva Republica) — corporate-backed, hundreds of contributors

Key difference: es-toolkit’s pitch is being a faster, smaller, TypeScript-native lodash — it competes on performance and migration ease for existing lodash codebases. helpers4’s pitch is covering that same general-purpose ground and the domains general toolkits skip entirely (dates, URLs, semver, observables). They overlap heavily on the “general utility” surface (array/object/string/predicates, and as of helpers4 v3.0.5, Map/Set and concurrency primitives too) — see below for exactly where real gaps remain on either side.

What es-toolkit still has that helpers4 doesn’t

Section titled “What es-toolkit still has that helpers4 doesn’t”

As of v3.0.5, helpers4 closed most of what used to be here — @helpers4/map, @helpers4/set, createMutex/createSemaphore, and median/percentile/meanBy/sumBy all shipped. Two real gaps remain:

Async-aware array iteration — partial coverage

Section titled “Async-aware array iteration — partial coverage”

es-toolkit: filterAsync, mapAsync, forEachAsync, flatMapAsync, reduceAsync, plus limitAsync for concurrency-limited async iteration. helpers4 has filterAsync, mapAsync, forEachAsync (same semantics — the async counterparts to their Array.prototype namesakes) but no flatMapAsync, reduceAsync, or a concurrency-limiting limitAsync — for that, helpers4’s @helpers4/promise has parallel/parallelSettle, but as standalone promise helpers rather than integrated Array.prototype-shaped iteration methods.

es-toolkit has median, percentile, and *By iteratee variants (meanBy, medianBy, sumBy) for computing stats over a derived value. helpers4’s @helpers4/array now has median, percentile, meanBy, and sumBy too — the one remaining gap is medianBy (median over a derived value rather than the raw items).

What helpers4 now has that es-toolkit doesn’t

Section titled “What helpers4 now has that es-toolkit doesn’t”

Bulk object-key case transforms — helpers4 goes further

Section titled “Bulk object-key case transforms — helpers4 goes further”

es-toolkit has toCamelCaseKeys/toSnakeCaseKeys (2 variants) to recursively transform every key of an object to a case style in one call. helpers4’s @helpers4/object has camelCaseKeys, kebabCaseKeys, pascalCaseKeys, snakeCaseKeys, and titleCaseKeys (5 variants, all built on the same mapDeep engine, recursing into arrays too) — the reverse of the gap that used to be here.

helpers4es-toolkitNotes
chunkchunkSame
compactcompactSame
countBycountBySame
differencedifference (+differenceBy/differenceWith)Same, es-toolkit adds iteratee/comparator variants
intersectionintersection (+By/With)Same
partitionpartitionSame
samplesample (+sampleSize)Same
shuffleshuffleSame
sort / sortBysortBy / orderByes-toolkit has no plain sort, only iteratee-based
uniqueuniq (+uniqBy/uniqWith)Same concept, different name
unzipunzip (+unzipWith)Same
withoutwithoutSame
zipzip (+zipWith/zipObject)Same
cartesianProductcartesianProductSame — exact match
max / minmaxBy / minByes-toolkit has no plain max/min either, only iteratee-based
replaceOrAppend, toggle, symmetricDifference, ensureArray, sortNaturalhelpers4 only
windowed, pull/pullAt/remove, keyBy, combinations, toFilledes-toolkit only
helpers4es-toolkitNotes
debouncedebounceSame
throttlethrottleSame
memoizememoizeSame
onceonceSame
partialpartial (+partialRight)Same
negatenegateSame
identityidentitySame
noopnoopSame
currycurry (+curryRight)Same
unaryunarySame — exact match
pipeflowSame concept, different name
composeflowRightSame concept, different name
flip, returnOrThrowErrorhelpers4 only
retry, before/after, ary, spread, restes-toolkit only

Both converge heavily here (isArray, isBoolean, isDate, isFunction, isMap, isNumber, isPlainObject, isPromise, isRegExp, isSet, isString, isSymbol, isUndefined all match by name). es-toolkit-only: isBrowser/isNode (environment detection), isJSON/isJSONArray/isJSONObject/isJSONValue (JSON-shape validation), isLength, isBuffer, isFile, isTypedArray. helpers4-only: the Temporal API guards (isTemporalDuration, isTemporalInstant, isTemporalPlainDate, etc.) and browser-form guards (isFormData, isBlob, isArrayBuffer, isCssColor) — es-toolkit has neither.

helpers4es-toolkitNotes
clone / cloneDeepclone / cloneDeep (+cloneDeepWith)Same
omit / omitByomit / omitBySame
pick / pickBypick / pickBySame
invertinvertSame
mergeDeepmerge / mergeWith / toMergedSame concept
flatten and unflattenflattenObject (one direction only)helpers4 covers both directions, es-toolkit only flattens
sortKeyssortKeysSame
camelCaseKeys/kebabCaseKeys/pascalCaseKeys/snakeCaseKeys/titleCaseKeystoCamelCaseKeys/toSnakeCaseKeyshelpers4 covers 5 case styles, es-toolkit 2 (see above)
removeUndefinedNull, safeJsonParse, parsePropertyPathhelpers4 only
helpers4es-toolkitNotes
countBycountBySame
everyeverySame
filterfilterSame
findKeyfindKeySame
findValuefindValueSame
mapKeysmapKeysSame
mapValuesmapValuesSame
reducereduceSame
somesomeSame
toMapByKeykeyBySame concept, different name
hasValuehelpers4 only — Map.prototype.has checks keys, not values, so this fills a real native gap
forEaches-toolkit only, though native Map.prototype.forEach already covers this without a helper
helpers4es-toolkitNotes
countBycountBySame
filterfilterSame
mapmapSame
toMapByKeykeyBySame concept, different name
find, and likely some/every/reduce matching its Map coveragees-toolkit only — helpers4’s Set coverage is narrower than its Map coverage
helpers4es-toolkitNotes
createMutexMutexSame concept — FIFO-queued mutual-exclusion lock
createSemaphoreSemaphoreSame concept — FIFO-queued, limits concurrent holders
delayhelpers4 only (already existed pre-v3.0.5)
timeoutwithTimeoutSame concept — reject if a promise doesn’t settle in time
retryretrySame
settle, parallel, parallelSettlehelpers4 only

Both have the full case-conversion set (camelCase, kebabCase, snakeCase, pascalCase, capitalize). helpers4’s removeDiacritics matches es-toolkit’s deburr (same concept). Both have words. es-toolkit-only: constantCase, startCase (≈ helpers4’s titleCase), reverseString. helpers4-only: dedent, escapeHtml/unescapeHtml, extractErrorMessage, injectWordBreaks, isBlank/isNotBlank, leadingSentence, slugify, template, truncate.

ScenarioRecommendation
You need date formatting/comparisonhelpers4 (@helpers4/date)
You need URL path manipulationhelpers4 (@helpers4/url)
You need semver parsing/comparisonhelpers4 (@helpers4/version)
You need RxJS observable combinatorshelpers4 (@helpers4/observable)
You’re migrating an existing lodash codebasees-toolkit (es-toolkit/compat is a near drop-in)
You need full async array iteration (flatMapAsync, reduceAsync, limitAsync) or medianByes-toolkit
You need bulk object-key case transforms (5 case styles, not 2)helpers4
You need Temporal API guards or browser-form guards (FormData, Blob)helpers4
Multiple needshelpers4 + es-toolkit — they overlap on the basics but neither fully subsumes the other

es-toolkit is the strongest general-purpose competitor in this comparison by adoption and momentum (Toss-backed, ~2M weekly downloads, releasing multiple times a week). It used to cover real ground helpers4 didn’t — Map/Set utilities, concurrency primitives, richer statistics — but as of helpers4 v3.0.5 that gap mostly closed, and helpers4 now goes further on bulk object-key case transforms. What’s left: es-toolkit’s async array iteration is more complete (flatMapAsync, reduceAsync, concurrency-limited limitAsync), and it has medianBy where helpers4 doesn’t. helpers4 still holds its own domain-specific ground (dates, URLs, semver, observables, Temporal guards) that es-toolkit’s lodash-replacement scope never aimed to cover. Where they overlap (arrays, objects, strings, basic predicates, and now Map/Set/concurrency too), coverage is close to 1:1 — pick based on the narrow gaps that matter for your project, or use both.