Lodash upgrade v4.17.x (>v5.5)
Jelikož se používal starý Lodash z roku 2015, dojde po upgradu k tomu, že některé funkce už nejsou podporovány a musí se použít nové. Zde je soupis toho nejdůležitějšího:
Pozor, zásadní update je u funkce _.find!
Důležitá změna ve funkcionalitě _.find
v Lodash
Pozor! V novější verzi Lodash došlo k zásadní změně ve funkci _.find
, která ovlivňuje způsob, jakým se předávají parametry pro hledání podle klíče a hodnoty.
Tento zápis se objevuje často i ve skriptech dynamických řádků!
Původní zápis:
V Lodash verze 3.x bylo možné použít následující zápis:
var dtCC = _.find(currentTask.processVars, 'tvar_name', '_dtCostCenters').ivar_value;
Tento způsob umožňoval předat přímo klíč ('tvar_name'
) a hodnotu ('_dtCostCenters'
) jako další parametry funkce.
Nový zápis:
V novějších verzích Lodash (4.x a vyšší) je třeba použít objektový predikát pro vyhledávání podle klíče a hodnoty. Nový zápis vypadá takto:
var dtCC = _.find(currentTask.processVars, { tvar_name: '_dtCostCenters' }).ivar_value;
Místo samostatných parametrů nyní používáme objekt { tvar_name: '_dtCostCenters' }
, který specifikuje, že _.find
má najít první objekt s vlastností tvar_name
rovnou hodnotě '_dtCostCenters'
.
//Starý zápis
var dtCC = _.find(currentTask.processVars, 'tvar_name', '_dtCostCenters').ivar_value;
//Nový zápis
var dtCC = _.find(currentTask.processVars, ['tvar_name', '_dtCostCenters']).ivar_value;
Doporučení:
Všechny výskyty _.find
ve starém formátu je nutné upravit na nový formát, aby kód fungoval správně s novou verzí Lodash.
Další příklady:
//Starý zápis
rowIndex = (_.find(dynTable[_nazevDynTable1], 'col_1', formLang) || {}).dlv_index;
//Nový zápis
rowIndex = (_.find(dynTable[_nazevDynTable1], { col_1: formLang }) || {}).dlv_index;
//Starý zápis
rowText = _.find(self.dynTable[_nazevDynTable1], 'dlv_index', rowIndex);
//Nový zápis
rowText = _.find(self.dynTable[_nazevDynTable1], { dlv_index: rowIndex });
//Starý zápis
const taskDecision = _.find(currentTask.immutableItems, 'tvar_name', 'taskDecision');
//Nový zápis
const taskDecision = _.find(currentTask.immutableItems, { tvar_name: 'taskDecision' });
Postup upgradu na nový lodash
Zjištění použitých již nepodporovaných lodash funkcí:
V rámci administrace (od verze TAS 5.3.16) je možné pustit v Konzoli následujícíc příkazy, které Vám vypíší seznam již nepodporovaných lodash funkcí.
sys.validateTemplate(tprocId: number);
Tato funkce zvaliduje Vámi zvolenou konkrétní šablonu a vypíše výskyt nepodporovaných funckí. Skript kouká do:
- Výpočtů
- Dynamických podmínek
- Dynamických řádků
- Tiskových šablon
sys.validateTemplates();
Tato funkce zvaliduje všechny šablony a vypíše výskyt nepodporovaných funckí. Skript kouká do:
- Výpočtů
- Dynamických podmínek
- Dynamických řádků
- Tiskových šablon
sys.validateGlobalScripts();
Tato funkce provede kontrolu v globálních skriptech (Výpočty, CO React, CO)
Nahrazení nepodporovaných funkcí novými:
- Proveďte nahrazení nalezených nepodporovaných funckí novými.
U Aktualizace podpisů metod:
- Aktualizujte volání metod, která používala thisArg, aby používala _.bind nebo šipkové funkce.
V Lodash 4 byla odstraněna podpora pro parametr thisArg z některých funkcí, což znamená, že kód, který se na tento argument spoléhal, může přestat fungovat správně.
V předchozích verzích Lodash (3.x a starších) bylo běžné používat thisArg pro nastavení kontextu (this) v některých metodách jako například _.map, _.forEach, nebo _.reduce.
V Lodash 4 je doporučeno místo thisArg používat buď:
_.bind
Tato funkce explicitně nastaví kontext (this) pro danou funkci.
//Příklad
var boundFunction = _.bind(func, context);
Šipkové funkce
Tyto funkce v JavaScriptu automaticky uchovávají kontext (this) z nadřazeného lexikálního prostředí, což eliminuje potřebu thisArg.
//Příklad
array.map(item => this.someMethod(item));
Používání nových metod:
- V rámci nového lodashe je možno využívat i nové funckionality.
Otestování změn:
- Prověďte otestování změn.
Příklad 1: Použití _.pluck
Old Code:
var users = [{ 'user': 'barney' }, { 'user': 'fred' }];
var names = _.pluck(users, 'user');
New Code:
var users = [{ 'user': 'barney' }, { 'user': 'fred' }];
var names = _.map(users, 'user');
Příklad 2: Použití _.where
Old Code:
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false }
];
var activeUsers = _.where(users, { 'active': true });
New Code:
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false }
];
var activeUsers = _.filter(users, { 'active': true });
Příklad 3: Použití thisArg
Old Code:
var obj = { 'value': 1 };
function callback(item) {
return item.value + this.value;
}
var result = _.map([{ 'value': 2 }, { 'value': 3 }], callback, obj);
New Code:
var obj = { 'value': 1 };
function callback(item) {
return item.value + this.value;
}
var boundCallback = _.bind(callback, obj);
var result = _.map([{ 'value': 2 }, { 'value': 3 }], boundCallback);
🔥 Breaking Changes
- Removed
thisArg
parameter: Methods no longer acceptthisArg
. Use_.bind
or arrow functions instead.
Method Removals:
_.pluck
: Use_.map
with iteratee shorthand._.where
and_.findWhere
: Use_.filter
and_.find
with iteratee shorthand._.support
: Removed.
Method Renames:
_.first
to_.head
_.indexBy
to_.keyBy
_.invoke
to_.invokeMap
_.padLeft
and_.padRight
to_.padStart
and_.padEnd
_.pairs
to_.toPairs
_.rest
to_.tail
_.sortByOrder
to_.orderBy
_.trimLeft
and_.trimRight
to_.trimStart
and_.trimEnd
Split Methods:
_.max
&_.min
into_.maxBy
&_.minBy
_.assign
&_.assignIn
into_.assignWith
&_.assignInWith
_.clone
&_.cloneDeep
into_.cloneWith
&_.cloneDeepWith
_.indexOf
&_.lastIndexOf
into_.sortedIndexOf
&_.sortedLastIndexOf
_.isEqual
into_.isEqualWith
_.isMatch
into_.isMatchWith
_.merge
into_.mergeWith
_.omit
&_.pick
into_.omitBy
&_.pickBy
_.sample
into_.sampleSize
_.sortedIndex
into_.sortedIndexBy
_.sortedLastIndex
into_.sortedLastIndexBy
_.sum
into_.sumBy
_.uniq
into_.sortedUniq
,_.sortedUniqBy
, &_.uniqBy
_.zipObject
into_.fromPairs
Removed Aliases:
_.all
->_.every
_.any
->_.some
_.backflow
->_.flowRight
_.callback
->_.iteratee
_.collect
->_.map
_.compose
->_.flowRight
_.contains
->_.includes
_.detect
->_.find
_.foldl
->_.reduce
_.foldr
->_.reduceRight
_.include
->_.includes
_.inject
->_.reduce
_.methods
->_.functions
_.object
->_.fromPairs
or_.zipObject
_.run
->_.value
_.select
->_.filter
_.unique
->_.uniq
Updated
by Anna Gernát