用本机javascript实现lodash_.has的简单方法是什么



我知道我们可以使用类似的东西

export function has(object, key) {
object.hasOwnProperty(key)
}

实现CCD_ 1非常基本的行为。我也知道lodash.has的独立软件包正是这样做的。

但在我看来,_.has不应该花费几百行。有哪些较短的替代方案?

p.s.不是一个代码高尔夫问题

因此,基本上您正在尝试创建lodash_.has的替代方案,但我们不想写一千行代码来处理所有可能的角落情况。这里是我为您实现的has的较轻版本,如果数据不合适,它不会下降(但显然它不会处理lodash中处理的那么多情况(。

我只是简单地接受了2个输入(作为参数(1:SOource,2:Path(点分隔的字符串/键或字符串数组(,然后遍历这些键,检查该键是否存在,如果存在,我将当前源更新为该键包含的值,并遵循相同的过程。

这是一个代码段:

function has(src, path = []) {
let _path = Array.isArray(path) ? path.slice() : (path || '').split('.'),
o = src,
idx = 0;
if (_path.length === 0) {
return false;
}
for (idx = 0; idx < _path.length; idx++) {
const key = _path[idx];
if (o != null && o.hasOwnProperty(key)) {
o = o[key];
} else {
return false;
}
}
return true;
}
const obj1 = {a: {b: {c: {d: {e: {f: {g: { h: 210}}}}}}}};
//you can send the path as a array of sequential keys
console.log(has(obj1, ['a', 'b', 'c', 'd', 'e'])) // valid path
console.log(has(obj1, ['a', 'b', 'c', 'd', 'x', 'y'])) //invalid path
//Or, you can pass the path as a single string
console.log(has(obj1, 'a.b.c.d.e.f.g.h')) // valid path
console.log(has(obj1, 'a.x.y.b.c.d.e.f.g.h')) //invalid path

最新更新