使用lodash get()访问嵌套列表是否存在问题或性能折衷

时间:2018-10-26 23:34:10

标签: lodash

使用lodash get访问嵌套列表时,是否存在问题或性能折衷?

示例

  

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

     

//这样好吗   _.get(tempObject,'li.nestedLi.0')

     

//还是更好   _.get(tempObject,'li.nestedLi [0]')

1 个答案:

答案 0 :(得分:0)

通过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方法之间在性能方面的差异微不足道。

这是the base _.get implementation

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

这是castPath

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

_.result会走这条路,并检查途中是否有功能,如果有功能将执行它们并继续前进。在淘汰赛场景中非常方便,因为它可以节省常用的ko.unwrap等。