我正在从可能未定义的全局变量中获取键。密钥也可能不存在:
import { get } from 'lodash/fp';
const probablyGlobalFoo = typeof globalFoo === 'undefined' ? void 0 : globalFoo;
const baz = get('baz', probablyGlobalFoo) || get('bar.baz', probablyGlobalFoo) || 'baz';
typeof globalFoo === 'undefined'
检查是JavaScript惯用的,但是笨拙且冗长。这种情况在我的代码库中发生过两次,但不足以向我的utils库引入另一个辅助函数。我宁愿只提供正确处理的getter函数,例如:
getFromAGetterAndCatchIfNotDefined('bar.baz', () => globalFoo);
是否可以使用我缺少的Lodash FP或Ramda API来处理这种情况?
答案 0 :(得分:2)
如果全局变量是在window
上定义的(对于全局var
),则可以检查window.globalFoo
(或在nodejs中为global.globalFoo
)。如果不是,则必须使用typeof
检查。
要检查对象中不存在的属性或未定义的变量,可以使用lodash / fp的getOr()
:
const { getOr } = _;
console.log(getOr('baz', 'bar.baz', window.globalFoo));
const anotherValue = { bar: { baz: 5 } }
console.log(getOr('baz', 'bar.baz', anotherValue));
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>
或者lodash的get()
:
const { get } = _;
console.log(get(window.globalFoo, 'bar.baz', 'baz'));
const anotherValue = { bar: { baz: 5 } }
console.log(get(anotherValue, 'bar.baz', 'baz'));
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js)"></script>
或者ramda的pathOr()
:
const { pathOr } = R;
console.log(pathOr('baz', ['bar','baz'], window.globalFoo));
const anotherValue = { bar: { baz: 5 } }
console.log(pathOr('baz', ['bar','baz'], anotherValue));
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>