Есть ли проблема или компромисс производительности с использованием lodash get () для доступа к вложенному списку? - PullRequest
0 голосов
/ 27 октября 2018

Есть ли проблема или компромисс между производительностью и доступом к вложенному списку при использовании lodash get

пример

const tempObject = {li: {nestedLi: [1, 2]}};

// Это лучше _.get (tempObject, 'li.nestedLi.0')

// или это лучше _.get (tempObject, 'li.nestedLi [0] ')

1 Ответ

0 голосов
/ 27 октября 2018

У вас есть несколько способов получить значение через lodash.Все они действительны:

const tempObject = { li: { nestedLi: [1, 2] } };

console.log(_.get(tempObject, 'li.nestedLi.0'))          // dot
console.log(_.get(tempObject, 'li.nestedLi[0]'))         // bracket
console.log(_.get(tempObject, ['li', 'nestedLi', '0']))  // array

console.log(_.result(tempObject, 'li.nestedLi.0'))  
console.log(_.result(tempObject, 'li.nestedLi[0]')) 
console.log(_.result(tempObject, ['li', 'nestedLi', '0'])) 

Различия в производительности между методами _.get незначительны.

Это базовая реализация _.get :

function baseGet(object, path) {
  path = castPath(path, object);

  var index = 0,
      length = path.length;

  while (object != null && index < length) {
    object = object[toKey(path[index++])];
  }
  return (index && index == length) ? object : undefined;
}

, которая в основном преобразует путь в массив, а затем использует while для обхода пути.Так что на самом деле вы могли бы сказать, что использование записи массива сэкономит вам время, поскольку castPath не нужно cast it:)

Это castPath :

   function castPath(value, object) {
      if (isArray(value)) {
        return value;
      }
      return isKey(value, object) ? [value] : stringToPath(toString(value));
    }

_.result пройдёт путь и проверит, есть ли функции среди пути, и если они есть, он выполнит их и продолжит движение.Весьма удобно в сценариях с нокаутом, поскольку это спасает вас от привычных ko.unwrap и т. Д.

...