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

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

  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);

🔥 Breaking Changes

  • 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

Contact

Team assistant (opens in a new tab)

Powered by HelpDocs (opens in a new tab)