Util (工具)
_.attempt(func, [args])
引入版本 3.0.0
尝试调用 func,返回其结果或捕获到的错误对象。任何附加的参数都会在调用 func 时传入。
参数
- func
(Function): 要尝试调用的函数。 - [args]
(...*): 调用func时传入的参数。
返回
- (*): 返回
func的结果或错误对象。
示例
// 避免为无效的选择器抛出错误
var elements = _.attempt(function (selector) {
return document.querySelectorAll(selector);
}, ">_>");
if (_.isError(elements)) {
elements = [];
}_.bindAll(object, methodNames)
引入版本 0.1.0
将对象的方法绑定到对象本身,并覆盖现有的方法。
注意: 这个方法不会设置绑定函数的 "length" 属性。
参数
- object
(Object): 需要绑定并赋值绑定方法的目标对象。 - methodNames
(...(string|string[])): 需要绑定的对象方法名。
返回
- (Object): 返回
object。
示例
var view = {
label: "docs",
click: function () {
console.log("clicked " + this.label);
},
};
_.bindAll(view, ["click"]);
jQuery(element).on("click", view.click);
// => 点击时输出 'clicked docs'_.cond(pairs)
引入版本 4.0.0
创建一个函数,该函数会遍历 pairs(断言函数与执行函数的组合列表),并执行 第一个 断言函数返回真值(truthy)时所对应的执行函数。
断言函数和执行函数在调用时,都会绑定 this 并传入创建函数接收到的参数。
参数
- pairs
(Array): 断言-执行函数对的数组。
返回
- (Function): 返回新的组合函数。
示例
var func = _.cond([
[_.matches({ a: 1 }), _.constant("matches A")],
[_.conforms({ b: _.isNumber }), _.constant("matches B")],
[_.stubTrue, _.constant("no match")],
]);
func({ a: 1, b: 2 });
// => 'matches A'
func({ a: 0, b: 1 });
// => 'matches B'
func({ a: "1", b: "2" });
// => 'no match'_.conforms(source)
引入版本 4.0.0
创建一个函数。该函数通过调用 source 对象中包含的断言属性(predicate properties)与传入对象相应的属性值进行匹配。如果所有断言属性都返回真值(truthy),则该函数返回 true,否则返回 false。
注意: 创建的函数相当于预设了 source 参数的 _.conformsTo。
参数
- source
(Object): 包含属性断言的对象。
返回
- (Function): 返回新的检测函数。
示例
var objects = [
{ a: 2, b: 1 },
{ a: 1, b: 2 },
];
_.filter(
objects,
_.conforms({
b: function (n) {
return n > 1;
},
})
);
// => [{ 'a': 1, 'b': 2 }]_.constant(value)
引入版本 2.4.0
创建一个返回 value 的函数。
参数
- value
(*): 新函数要返回的值。
返回
- (Function): 返回新的常量函数。
示例
var objects = _.times(2, _.constant({ a: 1 }));
console.log(objects);
// => [{ 'a': 1 }, { 'a': 1 }]
console.log(objects[0] === objects[1]);
// => true_.defaultTo(value, defaultValue)
引入版本 4.14.0
检查 value,以确定是否需要用默认值替换它。如果 value 是 NaN、null 或 undefined,那么返回 defaultValue。
参数
- value
(*): 要检查的值。 - defaultValue
(*): 默认值。
返回
- (*): 返回解析后的值。
示例
_.defaultTo(1, 10);
// => 1
_.defaultTo(undefined, 10);
// => 10_.flow([funcs])
引入版本 3.0.0
创建一个函数。该函数返回调用给定函数序列的结果,其中每个连续的函数调用都会接收前一个函数的返回值作为参数。(即:将函数从左到右组合)。创建的函数的 this 绑定会被传递给每个函数。
参数
- [funcs]
(...(Function|Function[])): 要调用的函数数组。
返回
- (Function): 返回新的组合函数。
示例
function square(n) {
return n * n;
}
var addSquare = _.flow([_.add, square]);
addSquare(1, 2);
// => 9_.flowRight([funcs])
引入版本 3.0.0
这个方法类似 _.flow,区别在于它创建的函数是从右到左调用给定的函数。(这通常被称为 函数组合 / Composition)。
参数
- [funcs]
(...(Function|Function[])): 要调用的函数数组。
返回
- (Function): 返回新的组合函数。
示例
function square(n) {
return n * n;
}
var addSquare = _.flowRight([square, _.add]);
addSquare(1, 2);
// => 9_.identity(value)
引入版本 0.1.0
这个方法返回它接收到的第一个参数。
参数
- value
(*): 任何值。
返回
- (*): 返回
value。
示例
var object = { a: 1 };
console.log(_.identity(object) === object);
// => true_.iteratee([func=_.identity])
引入版本 4.0.0
创建一个函数,该函数会用它接收到的参数来调用 func。
- 如果
func是一个属性名,创建的函数返回给定元素的属性值。 - 如果
func是一个对象,对于包含等价源属性的元素,创建的函数返回true,否则返回false。
(简而言之,这就是 Lodash 将字符串、对象等简写转换为函数的核心方法)。
参数
- [func=_.identity]
(*): 要转换为回调函数的值。
返回
- (Function): 返回回调函数。
示例
var users = [
{ user: "barney", age: 36, active: true },
{ user: "fred", age: 40, active: false },
];
// 使用 `_.matches` 的迭代器简写
_.filter(users, _.iteratee({ user: "barney", active: true }));
// => [{ 'user': 'barney', 'age': 36, 'active': true }]
// 使用 `_.matchesProperty` 的迭代器简写
_.filter(users, _.iteratee(["user", "fred"]));
// => [{ 'user': 'fred', 'age': 40, 'active': false }]
// 使用 `_.property` 的迭代器简写
_.map(users, _.iteratee("user"));
// => ['barney', 'fred']
// 创建自定义的迭代器简写
_.iteratee = _.wrap(_.iteratee, function (iteratee, func) {
return !_.isRegExp(func)
? iteratee(func)
: function (string) {
return func.test(string);
};
});
_.filter(["abc", "def"], /ef/);
// => ['def']_.matches(source)
引入版本 3.0.0
创建一个函数,该函数在给定对象和 source 之间执行深度的部分比较。如果给定对象包含等价的属性值,则返回 true,否则返回 false。
注意: 创建的函数相当于预设了 source 参数的 _.isMatch。 部分比较时,空的数组或对象 source 值可以匹配任何数组或对象值。请参考 _.isEqual 了解支持的值比较列表。
参数
- source
(Object): 要匹配的属性值对象。
返回
- (Function): 返回新的检测函数。
示例
var objects = [
{ a: 1, b: 2, c: 3 },
{ a: 4, b: 5, c: 6 },
];
_.filter(objects, _.matches({ a: 4, c: 6 }));
// => [{ 'a': 4, 'b': 5, 'c': 6 }]_.matchesProperty(path, srcValue)
引入版本 3.2.0
创建一个函数,该函数会在给定对象的 path(路径)上的值与 srcValue 之间执行深度的部分比较。如果对象的值与 srcValue 等价,则返回 true,否则返回 false。
注意: 部分比较时,空的数组或对象 srcValue 值可以匹配任何数组或对象值。请参考 _.isEqual 了解支持的值比较列表。
参数
- path
(Array|string): 要获取属性的路径。 - srcValue
(*): 要匹配的值。
返回
- (Function): 返回新的检测函数。
示例
var objects = [
{ a: 1, b: 2, c: 3 },
{ a: 4, b: 5, c: 6 },
];
_.find(objects, _.matchesProperty("a", 4));
// => { 'a': 4, 'b': 5, 'c': 6 }_.method(path, [args])
引入版本 3.7.0
创建一个函数,该函数会调用给定对象在 path(路径)上的方法。任何附加的 args 参数都会在调用时传给该方法。
参数
- path
(Array|string): 要调用的方法的路径。 - [args]
(...*): 调用方法时传入的参数。
返回
- (Function): 返回新的调用函数。
示例
var objects = [{ a: { b: _.constant(2) } }, { a: { b: _.constant(1) } }];
_.map(objects, _.method("a.b"));
// => [2, 1]
_.map(objects, _.method(["a", "b"]));
// => [2, 1]_.methodOf(object, [args])
引入版本 3.7.0
_.method 的反向操作;此方法创建一个函数,该函数调用 object 中给定 path(路径)上的方法。任何附加的 args 参数都会在调用时传给该方法。
参数
- object
(Object): 要查询的对象。 - [args]
(...*): 调用方法时传入的参数。
返回
- (Function): 返回新的调用函数。
示例
var array = _.times(3, _.constant),
object = { a: array, b: array, c: array };
_.map(["a[2]", "c[0]"], _.methodOf(object));
// => [2, 0]
_.map(
[
["a", "2"],
["c", "0"],
],
_.methodOf(object)
);
// => [2, 0]_.mixin([object=lodash], source, [options={}])
引入版本 0.1.0
将 source 对象中所有自身可枚举的函数属性(方法)添加到 object 目标对象中。如果 object 是一个函数,那么这些方法也会被添加到它的原型(prototype)上。
注意: 使用 _.runInContext 来创建一个原始的 lodash 函数,以避免因修改原始 lodash 而导致的冲突。
参数
- [object=lodash]
(Function|Object): 目标对象。 - source
(Object): 包含要添加方法的对象。 - [options={}]
(Object): 选项对象。 - [options.chain=true]
(boolean): 指定是否开启链式调用。
返回
- (*): 返回
object。
示例
function vowels(string) {
return _.filter(string, function (v) {
return /[aeiou]/i.test(v);
});
}
// 将 `vowels` 混入 lodash
_.mixin({ vowels: vowels });
_.vowels("fred");
// => ['e']
// 开启链式调用
_("fred").vowels().value();
// => ['e']
// 禁用链式调用
_.mixin({ vowels: vowels }, { chain: false });
_("fred").vowels();
// => ['e']_.noConflict()
引入版本 0.1.0
将 _ 变量还原为加载 Lodash 之前的值,并返回 lodash 函数的引用。(用于解决命名冲突)。
返回
- (Function): 返回 lodash 函数。
示例
var lodash = _.noConflict();_.noop()
引入版本 2.3.0
这个方法返回 undefined。(通常用作默认的空操作回调函数)。
示例
_.times(2, _.noop);
// => [undefined, undefined]_.nthArg([n=0])
引入版本 4.0.0
创建一个函数,这个函数返回它接收到的第 n 个参数。如果 n 为负数,则返回从末尾开始的第 n 个参数。
参数
- [n=0]
(number): 要返回的参数索引。
返回
- (Function): 返回新的函数。
示例
var func = _.nthArg(1);
func("a", "b", "c", "d");
// => 'b'
var func = _.nthArg(-2);
func("a", "b", "c", "d");
// => 'c'_.over([iteratees=[_.identity]])
引入版本 4.0.0
创建一个函数,该函数会传入接收到的参数并调用 iteratees(迭代函数组)。最终返回一个包含所有迭代函数执行结果的数组。
参数
- [iteratees=[_.identity]]
(...(Function|Function[])): 要调用的迭代函数。
返回
- (Function): 返回新的函数。
示例
var func = _.over([Math.max, Math.min]);
func(1, 2, 3, 4);
// => [4, 1]_.overEvery([predicates=[_.identity]])
引入版本 4.0.0
创建一个函数,该函数传入接收到的参数并调用 predicates(断言函数组)。如果 所有 断言函数都返回真值(truthy),则该函数返回 true,否则返回 false。
参数
- [predicates=[_.identity]]
(...(Function|Function[])): 要检查的断言函数。
返回
- (Function): 返回新的函数。
示例
var func = _.overEvery([Boolean, isFinite]);
func("1");
// => true
func(null);
// => false
func(NaN);
// => false_.overSome([predicates=[_.identity]])
引入版本 4.0.0
创建一个函数,该函数传入接收到的参数并调用 predicates(断言函数组)。如果 任意一个 断言函数返回真值(truthy),则该函数返回 true,否则返回 false。
参数
- [predicates=[_.identity]]
(...(Function|Function[])): 要检查的断言函数。
返回
- (Function): 返回新的函数。
示例
var func = _.overSome([Boolean, isFinite]);
func("1");
// => true
func(null);
// => true
func(NaN);
// => false_.property(path)
引入版本 2.4.0
创建一个函数,该函数返回给定对象在 path(路径)上的值。
参数
- path
(Array|string): 要获取属性的路径。
返回
- (Function): 返回新的访问器函数。
示例
var objects = [{ a: { b: 2 } }, { a: { b: 1 } }];
_.map(objects, _.property("a.b"));
// => [2, 1]
_.map(_.sortBy(objects, _.property(["a", "b"])), "a.b");
// => [1, 2]_.propertyOf(object)
引入版本 3.0.0
_.property 的反向操作;此方法创建一个函数,该函数返回 object 中给定 path(路径)上的值。
参数
- object
(Object): 要查询的对象。
返回
- (Function): 返回新的访问器函数。
示例
var array = [0, 1, 2],
object = { a: array, b: array, c: array };
_.map(["a[2]", "c[0]"], _.propertyOf(object));
// => [2, 0]
_.map(
[
["a", "2"],
["c", "0"],
],
_.propertyOf(object)
);
// => [2, 0]_.range([start=0], end, [step=1])
引入版本 0.1.0
创建一个包含从 start 到 end(不包含 end)的数字数组(包含正数或负数)。
- 如果未指定
end,则将其设置为start,并将start设置为0。 - 如果未指定
end且start为负数,则step默认为-1。
注意: JavaScript 遵循 IEEE-754 标准解析浮点数值,可能会导致意外的结果(精度问题)。
参数
- [start=0]
(number): 范围的开始位置。 - end
(number): 范围的结束位置。 - [step=1]
(number): 增量(步长)或减量。
返回
- (Array): 返回数字范围数组。
示例
_.range(4);
// => [0, 1, 2, 3]
_.range(-4);
// => [0, -1, -2, -3]
_.range(1, 5);
// => [1, 2, 3, 4]
_.range(0, 20, 5);
// => [0, 5, 10, 15]
_.range(0, -4, -1);
// => [0, -1, -2, -3]
_.range(1, 4, 0);
// => [1, 1, 1]
_.range(0);
// => []_.rangeRight([start=0], end, [step=1])
引入版本 4.0.0
这个方法类似 _.range,区别在于它按 降序(descending order)填充值。
参数
- [start=0]
(number): 范围的开始位置。 - end
(number): 范围的结束位置。 - [step=1]
(number): 增量(步长)或减量。
返回
- (Array): 返回数字范围数组。
示例
_.rangeRight(4);
// => [3, 2, 1, 0]
_.rangeRight(-4);
// => [-3, -2, -1, 0]
_.rangeRight(1, 5);
// => [4, 3, 2, 1]
_.rangeRight(0, 20, 5);
// => [15, 10, 5, 0]
_.rangeRight(0, -4, -1);
// => [-3, -2, -1, 0]
_.rangeRight(1, 4, 0);
// => [1, 1, 1]
_.rangeRight(0);
// => []_.runInContext([context=root])
引入版本 1.1.0
使用给定的 context 对象创建一个新的、无污染的(pristine)lodash 函数。
参数
- [context=root]
(Object): 上下文对象。
返回
- (Function): 返回一个新的 lodash 函数。
示例
_.mixin({ foo: _.constant("foo") });
var lodash = _.runInContext();
lodash.mixin({ bar: lodash.constant("bar") });
_.isFunction(_.foo);
// => true
_.isFunction(_.bar);
// => false
lodash.isFunction(lodash.foo);
// => false
lodash.isFunction(lodash.bar);
// => true
// 在 Node.js 中创建一个增强版的 `defer`
var defer = _.runInContext({ setTimeout: setImmediate }).defer;_.stubArray()
引入版本 4.13.0
此方法返回一个新的空数组。
返回
- (Array): 返回新的空数组。
示例
var arrays = _.times(2, _.stubArray);
console.log(arrays);
// => [[], []]
console.log(arrays[0] === arrays[1]);
// => false_.stubFalse()
引入版本 4.13.0
此方法返回 false。
返回
- (boolean): 返回
false。
示例
_.times(2, _.stubFalse);
// => [false, false]_.stubObject()
引入版本 4.13.0
此方法返回一个新的空对象。
返回
- (Object): 返回新的空对象。
示例
var objects = _.times(2, _.stubObject);
console.log(objects);
// => [{}, {}]
console.log(objects[0] === objects[1]);
// => false_.stubString()
引入版本 4.13.0
此方法返回一个空字符串。
返回
- (string): 返回空字符串。
示例
_.times(2, _.stubString);
// => ['', '']_.stubTrue()
引入版本 4.13.0
此方法返回 true。
返回
- (boolean): 返回
true。
示例
_.times(2, _.stubTrue);
// => [true, true]_.times(n, [iteratee=_.identity])
引入版本 0.1.0
调用 iteratee(迭代函数)n 次,将每次调用的结果存入数组并返回。
iteratee 调用时传入一个参数:(index)。
参数
- n
(number): 调用iteratee的次数。 - [iteratee=_.identity]
(Function): 每次迭代调用的函数。
返回
- (Array): 返回结果数组。
示例
_.times(3, String);
// => ['0', '1', '2']
_.times(4, _.constant(0));
// => [0, 0, 0, 0]_.toPath(value)
引入版本 4.0.0
将 value 转换为属性路径数组。
参数
- value
(*): 要转换的值。
返回
- (Array): 返回新的属性路径数组。
示例
_.toPath("a.b.c");
// => ['a', 'b', 'c']
_.toPath("a[0].b.c");
// => ['a', '0', 'b', 'c']_.uniqueId([prefix=''])
引入版本 0.1.0
生成一个唯一 ID。如果提供了 prefix(前缀),ID 会被添加到前缀后面。
参数
- [prefix='']
(string): 要添加到 ID 前面的值。
返回
- (string): 返回唯一 ID。
示例
_.uniqueId("contact_");
// => 'contact_104'
_.uniqueId();
// => '105'