Skip to content

Util (工具)

_.attempt(func, [args])

引入版本 3.0.0

尝试调用 func,返回其结果或捕获到的错误对象。任何附加的参数都会在调用 func 时传入。

参数

  • func (Function): 要尝试调用的函数。
  • [args] (...*): 调用 func 时传入的参数。

返回

  • (*): 返回 func 的结果或错误对象。

示例

js
// 避免为无效的选择器抛出错误
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

示例

js
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): 返回新的组合函数。

示例

js
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): 返回新的检测函数。

示例

js
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): 返回新的常量函数。

示例

js
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,以确定是否需要用默认值替换它。如果 valueNaNnullundefined,那么返回 defaultValue

参数

  • value (*): 要检查的值。
  • defaultValue (*): 默认值。

返回

  • (*): 返回解析后的值。

示例

js
_.defaultTo(1, 10);
// => 1

_.defaultTo(undefined, 10);
// => 10

_.flow([funcs])

引入版本 3.0.0

创建一个函数。该函数返回调用给定函数序列的结果,其中每个连续的函数调用都会接收前一个函数的返回值作为参数。(即:将函数从左到右组合)。创建的函数的 this 绑定会被传递给每个函数。

参数

  • [funcs] (...(Function|Function[])): 要调用的函数数组。

返回

  • (Function): 返回新的组合函数。

示例

js
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): 返回新的组合函数。

示例

js
function square(n) {
  return n * n;
}

var addSquare = _.flowRight([square, _.add]);
addSquare(1, 2);
// => 9

_.identity(value)

引入版本 0.1.0

这个方法返回它接收到的第一个参数。

参数

  • value (*): 任何值。

返回

  • (*): 返回 value

示例

js
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): 返回回调函数。

示例

js
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): 返回新的检测函数。

示例

js
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): 返回新的检测函数。

示例

js
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): 返回新的调用函数。

示例

js
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): 返回新的调用函数。

示例

js
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

示例

js
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 函数。

示例

js
var lodash = _.noConflict();

_.noop()

引入版本 2.3.0

这个方法返回 undefined。(通常用作默认的空操作回调函数)。

示例

js
_.times(2, _.noop);
// => [undefined, undefined]

_.nthArg([n=0])

引入版本 4.0.0

创建一个函数,这个函数返回它接收到的第 n 个参数。如果 n 为负数,则返回从末尾开始的第 n 个参数。

参数

  • [n=0] (number): 要返回的参数索引。

返回

  • (Function): 返回新的函数。

示例

js
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): 返回新的函数。

示例

js
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): 返回新的函数。

示例

js
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): 返回新的函数。

示例

js
var func = _.overSome([Boolean, isFinite]);

func("1");
// => true

func(null);
// => true

func(NaN);
// => false

_.property(path)

引入版本 2.4.0

创建一个函数,该函数返回给定对象在 path(路径)上的值。

参数

  • path (Array|string): 要获取属性的路径。

返回

  • (Function): 返回新的访问器函数。

示例

js
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): 返回新的访问器函数。

示例

js
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

创建一个包含从 startend不包含 end)的数字数组(包含正数或负数)。

  • 如果未指定 end,则将其设置为 start,并将 start 设置为 0
  • 如果未指定 endstart 为负数,则 step 默认为 -1

注意: JavaScript 遵循 IEEE-754 标准解析浮点数值,可能会导致意外的结果(精度问题)。

参数

  • [start=0] (number): 范围的开始位置。
  • end (number): 范围的结束位置。
  • [step=1] (number): 增量(步长)或减量。

返回

  • (Array): 返回数字范围数组。

示例

js
_.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): 返回数字范围数组。

示例

js
_.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 函数。

示例

js
_.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): 返回新的空数组。

示例

js
var arrays = _.times(2, _.stubArray);

console.log(arrays);
// => [[], []]

console.log(arrays[0] === arrays[1]);
// => false

_.stubFalse()

引入版本 4.13.0

此方法返回 false

返回

  • (boolean): 返回 false

示例

js
_.times(2, _.stubFalse);
// => [false, false]

_.stubObject()

引入版本 4.13.0

此方法返回一个新的空对象。

返回

  • (Object): 返回新的空对象。

示例

js
var objects = _.times(2, _.stubObject);

console.log(objects);
// => [{}, {}]

console.log(objects[0] === objects[1]);
// => false

_.stubString()

引入版本 4.13.0

此方法返回一个空字符串。

返回

  • (string): 返回空字符串。

示例

js
_.times(2, _.stubString);
// => ['', '']

_.stubTrue()

引入版本 4.13.0

此方法返回 true

返回

  • (boolean): 返回 true

示例

js
_.times(2, _.stubTrue);
// => [true, true]

_.times(n, [iteratee=_.identity])

引入版本 0.1.0

调用 iteratee(迭代函数)n 次,将每次调用的结果存入数组并返回。

iteratee 调用时传入一个参数:(index)

参数

  • n (number): 调用 iteratee 的次数。
  • [iteratee=_.identity] (Function): 每次迭代调用的函数。

返回

  • (Array): 返回结果数组。

示例

js
_.times(3, String);
// => ['0', '1', '2']

_.times(4, _.constant(0));
// => [0, 0, 0, 0]

_.toPath(value)

引入版本 4.0.0

value 转换为属性路径数组。

参数

  • value (*): 要转换的值。

返回

  • (Array): 返回新的属性路径数组。

示例

js
_.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。

示例

js
_.uniqueId("contact_");
// => 'contact_104'

_.uniqueId();
// => '105'