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'.

Jednodušší způsob přepisu je dát pouze parametry do hranatých závorek.
//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

1) Zjištění použitých již nepodporovaných lodash funkcí

V rámci administrace (od verze v5.3.16) je možné pustit v Konzoli následujícíc příkazy, které Vám vypíší seznam již nepodporovaných lodash funkcí. Případně můžete použít funkci sys.replaceDeprecatedLodashUsage() pro automatické nahrazení nejčastěji používaných zápisů _.find (od verze v5.7.37).

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)

2) Nahrazení nepodporovaných funkcí novými

  • Prověďte automatické nahrazení pomocí funkce:

sys.replaceDeprecatedLodashUsage()

Funkce pro automatické nahrazení nepodporovaných Lodash funkcí. Pokud je parametr prázdný, provede nahrazení ve všech šablonách. Pokud je vyplněno ID šablony, provede nahrazení pouze tam. Provádí automaticky nahrazení ve výpočtech, dyn. podmínkách a v dynamických řádcích. Provede automatické přepsání nepodporovaného zápisu _.find viz Lodash Upgrade

  • Proveďte poté znovu kontrolu pomocí funkcí validateGlobalScript a poté případně proveďte ruční nahrazení nalezených nepodporovaných funckí novými.

Změna podpory thisArg v Lodash 4

  • 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ď:

  1. _.bind Tato funkce explicitně nastaví kontext (this) pro danou funkci.
//Příklad
var boundFunction = _.bind(func, context);
  1. Š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);

🔥 Hlavní změny v update lodash

  • Removed thisArg parameter: Methods no longer accept thisArg. 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

Anna Gernát Updated by Anna Gernát

Hlavní změny a zaniklé funkce (v5.3 > v5.7)

Contact

Team assistant (opens in a new tab)

Powered by HelpDocs (opens in a new tab)