使用lodash get访问嵌套列表时,是否存在问题或性能折衷?
示例
const tempObject = {li:{nestedLi:[1,2]}};
//这样好吗 _.get(tempObject,'li.nestedLi.0')
//还是更好 _.get(tempObject,'li.nestedLi [0]')
答案 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
等。