npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

black-bible

v2.0.3

Published

A JavaScript tool library

Readme

black-bible

一些常用的Javascript工具函数,可以简化我们日常的很多操作

Install

npm i black-bible -S

Usage

在Node环境下:

const _ = require('black-bible');

function f (a, b,c) {
    return a + b + c;
}

_.curry(f, 1)(2)(3); // 6

使用ES6模块:

import _ from 'black-bible';

function f (a, b,c) {
    return a + b + c;
}

_.curry(f, 1)(2)(3); // 6

使用script标签:

<script src="black-bible/umd"></script>
<script>

function f (a, b,c) {
    return a + b + c;
}

_.curry(f, 1)(2)(3); // 6
</script>

Modules

add ⇒ Number

求所有参数的和

对于参数列表中的任何类型,都会尝试相加,所以可能会有强制类型转换

| Param | Type | Description | | --- | --- | --- | | ...args | any | 参数 |

Example

// 'abc'
console.log(_.add('a', 'b', 'c'))

// 6
console.log(_.add(1, 2, 3))

after ⇒ function

函数在count次后执行

限制函数在触发多少次后执行

Returns: function - 执行器函数

| Param | Type | Default | Description | | --- | --- | --- | --- | | fn | function | | 想要限制执行的函数 | | count | Number | | 次数 | | [point] | any | globalThis | 函数执行时环境,默认为globalThis |

Example

function after (n) {
    console.log('只有在点击四次后才会执行我');
}


let button = document.querySelector('button');

let exec = _.after(after, 4);

button.addEventListener('click', exec);

before ⇒ function

限制函数执行的次数

限制函数只能执行多少次,返回一个执行器函数,用来执行函数,次数到之后,再次执行函数 会失效,

Returns: function - 执行器函数

| Param | Type | Default | Description | | --- | --- | --- | --- | | fn | function | | 想要限制执行次数的函数 | | count | Number | | 执行次数 | | [point] | any | globalThis | 函数运行时所在环境,默认为globalThis |

Example

function before (n) {
    console.log('只有在前四次点击才会执行我');
}


let button = document.querySelector('button');

let exec = _.before(before, 4);

button.addEventListener('click', exec);

camelCase ⇒ String

驼峰化字符串

函数会舍弃字符串的所有特殊字符,无论是在开头还是中间还是结尾,而在非开头处的数字或特殊字符 后的字母会大写

Returns: String - 驼峰化后的字符串

| Param | Type | Description | | --- | --- | --- | | str | String | 想要驼峰化的字符串 |

Example

let str1 = '@!$as3gh-at^e123!@#';
let str2 = 'a1b2c3';

camelCase(str1); // as3GhAtE123
camelCase(str2); // a1B2C3

checkedType ⇒ String

判断类型的函数

该函数通过Object.prototype.toString方法来判断,所以 若是重写了该方法,函数可能会失效,函数会返回对应类型的大写形式,

Returns: String - 返回一个值对应的类型的字符串

| Param | Type | Description | | --- | --- | --- | | target | any | 一个需要检查类型的值 |

Example

_.checkedType({}); //  "Object"
 _.checkedType([]); // "Array"
 _.checkedType(true); // "Boolean"
 _.checkedType(undefined); // "Undefined"
 _.checkedType(null); // "Null"
 _.checkedType('str'); // "String"

compact ⇒ Array

获取真值数组

返回一个新数组,包含原数组的所有真值, 假值为:undefined, NaN, 0, false, null

Returns: Array - 数组中的真值元素组成的数组

| Param | Type | Description | | --- | --- | --- | | arr | Array | array |

Example

let arr = [0, 1, false, 2, null, '', 3, NaN, 4, undefined, 5];

// [1, 2, 3, 4, 5];
console.log( _.compact(arr) );

curry ⇒ function

函数柯里化的辅助函数

接受一个函数fn和可选的用于函数fn的参数,返回柯里化后的函数fn,即使函数fn的参数已经满足 同样会返回一个函数而不是fn调用的结果

Returns: function - 柯里化后的函数

| Param | Type | Description | | --- | --- | --- | | fn | function | 想要柯里化的函数 | | ...args | any | 函数fn所需要的参数 |

Example

function add (a, b, c, d) {
     console.log(a + b + c + d);
 }

let curried = _.curry(add, 1, 1, 1, 1);

curried();  // 4

let curried2 = _.curry(add);

curried2(1)(1)(1)(1);  // 4

curried2(1, 1)(1)(1);  // 4

curried2(1, 1, 1)(1);  // 4

debounce ⇒ function

创建一个防抖函数

创建一个防抖函数,根据option选项对象来决定delay延时开始前或结束 后调用回调函数,其中option.before决定是否在延时开始之前触发回调,若是为false,那么 无论option.after为true还是false,都会在延时结束后触发回调,option.after决定是否 在延时结束之后触发回调,函数返回的防抖函数拥有一个cancel方法,用来取消延时调用

Returns: function - debounced 防抖函数

| Param | Type | Description | | --- | --- | --- | | cb | function | 回调函数 | | delay | 0 | 延时 | | option | Object | 选项对象 | | [option.before] | Boolean | 是否在延时开始之前触发回调 | | [option.after] | Boolean | 是否在延时结束之后触发回调 |

Example

function go () {
        console.log('scroll');
}

window.addEventListener( 'scroll', _.debounce(go, 1000) );

window.addEventListener( 'scroll', _.debounce(go, 1000, {before: true, after: true}) );

deepClone ⇒ any

深拷贝函数

一个深拷贝函数,cloneProto参数决定是否拷贝一个对象的原型,不会忽略函数,对象的 Symbol属性,但是对于Symbol属性,仍然传递的是Symbol的引用

Returns: any - 深拷贝后的对象

| Param | Type | Description | | --- | --- | --- | | target | any | 想要进行深拷贝的对象 | | cloneProto | Boolean | 是否拷贝对象的原型 |

Example

let obj = {
     name: 'Jack',
     age: 30
};

let o2 = _.deepClone(obj);

delay ⇒ Object

延时函数

延时函数fn的执行wait毫秒,会返回一个定时器ID

Returns: Object - 定时器ID

| Param | Type | Default | Description | | --- | --- | --- | --- | | fn | function | | 想要延时的函数 | | wait | Number | | 延时 | | args | Array | | 函数fn需要的参数,需要放到一个数组里面 | | [point] | any | globalThis | 函数fn执行时环境,默认为globalThis |

Example

let obj = {
     name: 'Sun XiaoChuan',
     age: 6,
     introduction() {
     console.log(`My name is ${this.name} I'm ${this.age} years old`)
     }
}

// My name is sun Xiaochuan. I'm 6 years old
let timerId = delay(obj.introduction, 1000, [], obj);

divide ⇒ Boolean

求商

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 集合 |

Example

// 2
console.log(_.divide([4, 2]));

divideBy ⇒ Number

求商

接受一个函数作为第二参数,对集合内每个元素调用,用来决定求值的标准

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 集合 | | iterator | function | 迭代函数 |

Example

let arr = [
{age: 30},
{name: 'xxx'},
{age: 30}
];

let arrf = (o) => o.age;


// 1
console.log(_.divideBy(arr , arrf))

every ⇒ Boolean

every迭代函数

适用于多种类型的every函数,对于对象的每个元素调用函数,若所有属性都使 函数返回True则返回True,否则返回false

Returns: Boolean - 是否每个元素都对函数返回True

| Param | Type | Description | | --- | --- | --- | | target | Array | Object | Map | Set | object | | predicate | function | 断言函数 |

Example

let arr = [1, 2, 3];

console.log( _.every(arr, item => item > 0) );  // true

filter ⇒ Array

适用于各种类型的Filter迭代函数

适用于各种类型的Filter迭代函数,对于集合的每一项调用函数,返回函数返回True的 项组成的数组

Returns: Array - 函数返回true的项组成的数组

| Param | Type | Description | | --- | --- | --- | | target | Array | Map | Set | String | Number | 对象 | | cb | function | 对对象的元素调用的函数 |

Example

_.filter([1, 2, 3, 4], item => item % 2 === 0);   // [2, 4]

_.filter('Jack', char => true);  // ['J', 'a', 'c', 'k']

_.filter(5, n => true);   // [0, 1, 2, 3, 4];

find ⇒ any

find迭代函数

适用于多种类型的find方法,它返回第一个使断言函数返回true的项, 对于Object和Map类型,find返回的将不再是项,而是键值对中的键, fromIndex为迭代的起点,对于数组来说,是其索引,对于对象Map等类型来说, 是获取他们的所有键的数组的索引

Returns: any - 第一个使断言函数返回true的项

| Param | Type | Description | | --- | --- | --- | | target | Array | Map | Set | Object | object | | predicate | function | 断言函数, | | fromIndex | Number | 迭代的起始索引 |

Example

let arr = [1, 2, 3, 4, 5, 6];

console.log( _.find(arr, item => item > 3) );  // 4

let obj = {a: 1, b: 2, c: 3};

console.log(  _.find(obj, item => item > 2) );  // c

findRight ⇒ any

find函数的反向函数

从反方向开始迭代,返回第一个使函数返回True的项的值 对于对象或Map,返回的将是他们的键而不是值

Returns: any - 第一个使断言函数返回true的项

| Param | Type | Description | | --- | --- | --- | | target | Array | Object | Map | Set | object | | fn | function | 对象每一项调用的函数 | | fromIndex | Number | 迭代的起始索引 |

Example

let arr = [1, 2, 3, 4];

console.log( _.findRight(arr, item => item > 1) ); // 4

forEach ⇒ Array | Map | Set | String | Number | Object

forEach迭代函数

适用于各种类型的forEach,对集合的每一项运行函数,最终返回集合本身, 可以显式的通过返回false来终止循环

Returns: Array | Map | Set | String | Number | Object - 集合本身

| Param | Type | Description | | --- | --- | --- | | target | Array | Map | Set | String | Number | Object | 对象 | | cb | function | 对对象的元素调用的函数 |

Example

_.forEach([1, 2, 3], item => console.log(item)); 1, 2, 3

_.forEach({name: 'Jack', age: 30}, value => console.log(value)); // 'Jack', 30

forEachRight ⇒ Array | Object | Map | Set

forEachRight迭代函数

forEach函数的反向函数,从结尾开始迭代,可以通过返回false显式的 结束迭代,返回集合本身

| Param | Type | Description | | --- | --- | --- | | target | Array | Object | Map | Set | 想要迭代的集合 | | fn | function | 对每个元素调用的迭代函数 |

Example

let arr = [1, 2, 3, 4];

 _.forEachRight(arr, item => console.log(item));   // 4, 3, 2, 1

isArray

是否是数组类型

使用Array的isArray方法来进行检查

| Param | Type | Description | | --- | --- | --- | | value | any | 要检查的值 |

Example

// true
_.isArray([]);

isBigInt ⇒ Boolean

值是否是BigInt类型

| Param | Type | Description | | --- | --- | --- | | value | * | 需要检查的值 |

Example

let bigInt1 = 123n,
     bigInt2 = BigInt(456),
     bigInt3 = Object(789n);

// true
console.log( isBigInt(bigInt1) );
// true
console.log( isBigInt(bigInt2) );
// true
console.log( isBigInt(bigInt3) );

isBoolean ⇒ Boolean

检查是否是布尔值

| Param | Type | Description | | --- | --- | --- | | value | * | 需要检查的值 |

Example

// true
_.isBoolean(true)


// true
_.isBoolean(false)

isDate ⇒ Boolean

值是否是Date

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

isError ⇒ Boolean

是否是Error类型

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// true
console.log(_.isError(new Error()))

isFalseValue ⇒ Boolean

检查是否是假植

在这里,假值的概念为值等于 undefined ,null ,false ,0

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// false
console.log( _.isFalseValue(0) );
console.log( _.isFalseValue(false) );
console.log( _.isFalseValue(null) );
console.log( _.isFalseValue(undefined) );

isFinite ⇒ Boolean

值是否是有限数字

| Param | Type | Description | | --- | --- | --- | | value | * | 需要检查的值 |

Example

// true
console.log( _.isFinite(100) );

// false
console.log( _.isFinite(1e10000) );

isFunction ⇒ Boolean

值是否是函数

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// true
console.log(_.isFunction(function f(){}))

isInContainer ⇒ Boolean

判断一个元素是否在对应容器的可视区域内

Returns: Boolean - 是否在可视区域内

| Param | Type | Description | | --- | --- | --- | | el | Object | 判断是否在容器的目标DOM元素 | | container | Object | 容器DOM元素,默认为视口 |

isMap ⇒ Boolean

检查值是否为Map

| Param | Type | Description | | --- | --- | --- | | value | * | 需要检查的值 |

Example

// true
console.log(_.isMap(new Map()))

isNaN ⇒ Boolean

检查是否是NaN

与Javascript自带的isNaN不同,该函数只会对NaN值返回true

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// true
_.isNaN(NaN);

// false
_.isNaN('AAA');

isNodeEnv ⇒ Boolean

是否是Node环境

isNull ⇒ Boolean

检查值是否等于Null

| Param | Type | Description | | --- | --- | --- | | value | * | 需要检查的值 |

Example

// true
console.log(_.isNull(null));

isNumber ⇒ Boolean

检查是否是数字

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// true
_.isNumber(new Number(100));

// true
_.isNumber(100);

isObject ⇒ Boolean

检查是否是对象类型

对于任何对象类型包括函数返回True,对于null返回false和undefined返回false

| Param | Type | Description | | --- | --- | --- | | value | any | 想要检查的值 |

Example

// true
_.isObject([])

// false
_.isObject(null)

// false
_.isObject(undefined)

isObjectLike ⇒ Boolean

检查是否是类对象

跟isObject基本相同,只是会对函数返回false,也就是说对 一个非null非function对象返回True

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// false
_.isObjectLike(function f () {})

isPlainObject ⇒ Boolean

检查值是否为普通对象

一个普通对象为直接通过Object构造函数或对象字面量创建的对象, 一个对象若是继承了其他对象也算是普通对象

| Param | Type | Description | | --- | --- | --- | | value | * | 需要检查的值 |

Example

let o1 = {},
     o2 = {};

Object.setPrototypeOf(o1, o2);


// true
console.log(_.isPlainObject(o1))


// true
console.log(_.isPlainObject(o2))

isRegExp ⇒ Boolean

是否是RegExp

| Param | Type | Description | | --- | --- | --- | | value | * | 检查的值 |

Example

// true
console.log(_.isRegExp(new RegExp()))

isSet ⇒ Boolean

是否是Set

| Param | Type | Description | | --- | --- | --- | | value | * | 需要检查的值 |

Example

// true
console.log(_.isSet(new Set()))

isString ⇒ Boolean

检查是否是字符串

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// true
_.isString('aaa')

// true
_.isString(new String())

isSymbol ⇒ Boolean

检查值是否是Symbol

| Param | Type | Description | | --- | --- | --- | | value | * | 需要检查的值 |

Example

// true
console.log(_.isSymbol( Symbol("foo")))

// true
console.log(_.isSymbol(Object(Symbol("foo"))))

isTrueValue ⇒ Boolean

值是否是真值

在这里,真值的概念为不等于 undefined ,null ,0 ,false,

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// false
console.log(_.isTrueValue(undefined));

// false
console.log(_.isTrueValue(0));

// false
console.log(_.isTrueValue(null));

// false
console.log(_.isTrueValue(false));

// true
console.log(_.isTrueValue('0'));

isUndefined ⇒ Boolean

检查值是否是Undefined

| Param | Type | Description | | --- | --- | --- | | value | * | 需要检查的值 |

Example

// true
console.log( _.isUndefined(Undefined) );

isWeakMap ⇒ Boolean

检查值是否是WeakMap

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// true
console.log(_.isWeakMap(new WeakMap()))

isWeakSet ⇒ Boolean

检查值是否是WeakSet

| Param | Type | Description | | --- | --- | --- | | value | * | 想要检查的值 |

Example

// true
console.log(_.isWeakSet(new WeakSet()))

isWindow ⇒ Boolean

检查当前宿主环境是否为window

map ⇒ Array

map迭代函数

适用于各种类型的map迭代函数,对集合的每一项调用函数fn,返回函数 的返回值组成的数组

Returns: Array - 函数的返回值组成的数组

| Param | Type | Description | | --- | --- | --- | | target | Array | Map | Set | String | Number | obj | | fn | function | 迭代函数 |

Example

_.map(5, item => item + '号'); // [ '0号', '1号', '2号', '3号', '4号' ]

_.map([1, 2, 3, 4, 5], (item, index) => index + '号'); // [ '0号', '1号', '2号', '3号', '4号' ]

max ⇒ Number | String

集合的最大值

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 集合 |

Example

// 3
console.log(_.max([1, 2, 3]))

// c
console.log(_.max({'a', 'b', 'c'}))

maxBy ⇒ any

最大值

接受一个函数作为第二参数,用来决定求值的标准

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 集合 | | iterator | function | 迭代函数 |

Example

let arr = [
{age: 30},
{name: 'xxx'},
{age: 20}
];

let arrf = (o) => o.age;


// {age: 30}
console.log(_.maxBy(arr, arrf));

min ⇒ Number | String

求最小值

| Param | Type | Description | | --- | --- | --- | | collection | Array | Map | Set | Object | 集合 |

Example

// 0
console.log(_.min([1, 2, 3, 0]))

minBy ⇒ any

最小值

接受一个函数作为第二参数,用来决定求值的标准

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 集合 | | iterator | function | 迭代函数 |

Example

let arr = [
{age: 30},
{name: 'xxx'},
{age: 20}
];

let arrf = (o) => o.age;

// {age: 20}
console.log(_.minBy(arr, arrf));

multiply ⇒ Number

求集合的乘积

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 集合 |

Example

// 24
console.log(_.multiply([2, 3, 4]))

multiplyBy ⇒ Number

集合的乘积

接受一个函数作为第二参数,用来决定求值的标准

| Param | Type | Description | | --- | --- | --- | | collection | Array | Map | Set | Object | 集合 | | iterator | function | 迭代函数 |

Example

let arr = [
{age: 30},
{name: 'xxx'},
{age: 20}
];
let arrf = (o) => o.age;

// 600
console.log(_.multiplyBy(arr, arrf))

pull ⇒ Array

移除数组元素

删除数组中所有与给定值相等的元素,给定值可以有多个,该方法会在原数组修改, 返回修改完成后的数组

Returns: Array - 修改完成的数组

| Param | Type | Description | | --- | --- | --- | | arr | Array | array | | ...args | any | 想要删除的元素 |

Example

let arr = [1, 2, 3, 4, 3, 2, 6, 1, 2];

_.pull(arr, 1, 2);  //  [3, 4, 3, 6]

random ⇒ Number

随机数函数

返回min-max之间的随机数,包括min和max,默认返回整数

Returns: Number - 一个数字

| Param | Type | Description | | --- | --- | --- | | min | Number | 最小值 | | max | Number | 最大值 | | floating | Boolean | 是否包括浮点数 |

Example

// 2, 5, 1, 1, 2
_.forEach(5, () => {
console.log( _.random(1, 5) );
});

reduce ⇒ any

reduce归并函数

适用于多种类型的归并函数,函数接受四个参数, 前一项的值,当前项的值,当前项的索引,对象本身,函数的返回值会作为第一个 参数自动传给下一项,也可以通过使函数返回false终止迭代

Returns: any - 函数fn最终的返回值

| Param | Type | Description | | --- | --- | --- | | target | Array | String | Object | Map | Set | obj | | fn | function | 对目标每一项调用的函数 | | accumulator | any | 初始值 |

Example

let o = {a: 1, b: 2, c: 3};

// 6
let result = _reduce(o, (cur, pre) => {
     return pre + cur;
});

reduceRight ⇒ any

rediceRight归并函数

reduce函数的反向函数,从反方向开始迭代,对每一项调用函数fn, 函数fn接受4个参数,前一项的值,当前项的值,当前项的索引,对象本身, 若accumulator存在,则从第一项开始迭代,否则,从第二项开始迭代 若fn函数显式的返回false,则终止迭代,返回结果

Returns: any - 构建的最终值

| Param | Type | Description | | --- | --- | --- | | target | Array | Object | Map | Set | object | | fn | function | 对对象每个元素调用的函数 | | accumulator | any | 初始值 |

Example

let arr = [0, 1, 2, 3, 4];

console.log( _.reduceRight(arr, (pre, cur) => pre + cur) );  // 10

remove ⇒ Array

删除数组元素

删除数组中所有对函数返回True的项,返回删除的项,在原数组删除 断言函数接受三个参数,数组当前项的值,索引和数组本身

Returns: Array - 函数返回true的项组成的数组

| Param | Type | Description | | --- | --- | --- | | arr | Array | array | | fn | function | 断言函数, |

Example

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

_.remove(arr);    //  [ 2, 4, 6, 8, 10 ]

console.log(arr);  //  [ 1, 3, 5, 7, 9 ]

sample ⇒ any

随机获取集合的某一项的值

随机获取集合的某一项,对于Object和Map类型来说,获取得将会是他们的 Key,而不是Value

Returns: any - 集合的某一项

| Param | Type | Description | | --- | --- | --- | | target | Array | Object | Map | Set | String | 一个集合 |

Example

let arr = [1, 2, 3, 4];

// 3, 2, 2, 3, 3, 1, 2, 4, 4, 1

_.forEach(10, () => {
     console.log( _.sample(arr) )
})

sampleSize ⇒ Array

随机抽取一个集合的num个元素

随机抽取一个集合的num个元素,适用于多种类型,若是num大于集合内元素的数量,会随机抽取 集合所有的元素,会将抽取到的元素放到一个数组内,

Returns: Array - 抽取的元素组成的数组

| Param | Type | Description | | --- | --- | --- | | target | Array | Map | Set | Object | String | 想要随机抽取的对象 | | num | Number | 想要获得的元素数量 |

Example

let arr = [1, 2, 3, 4];

// [3, 1]
console.log(_.sampleSize(arr, 2));

// [2, 4, 3, 1]
console.log(_.sampleSize(arr, 100));

shuffle ⇒ Array | Object | Map | Set | String

打乱集合的顺序

打乱一个集合的顺序,不会改变原集合,而是返回一个新集合,

Returns: Array | Object | Map | Set | String - 打乱顺序后的集合

| Param | Type | Description | | --- | --- | --- | | target | Array | Object | Map | Set | String | 想要打乱顺序的集合 |

Example

let arr = [1, 2, 3, 4];

// [2, 4, 3, 1]
console.log(_.shuffle(arr));

let str = 'ABCD';

// 'ADBC';
console.log(_.shuffle(str));

size ⇒ Number

一个集合内元素的数量

对于数组和字符串,为他们的length属性,其他类型的对象,为对象内所有 的可迭代属性的数量

Returns: Number - 集合内元素的数量

| Param | Type | Description | | --- | --- | --- | | target | Array | String | Object | Map | Set | 一个集合 |

Example

let o = {name: 'Davi', age: 22};

// 2
console.log(_.size(o));

some ⇒ Boolean

some迭代函数

适用于多种类型的Some函数,对对象的每一项调用函数,若是有一项使函数返回True, 则返回True,否则返回false

| Param | Type | Description | | --- | --- | --- | | target | Array | Object | Map | Set | 对象 | | predicate | function | 断言函数 |

Example

let arr = [1, 2, 3, 4];

console.log( _.some(arr, item => item > 3) );  // true

subtract ⇒ Number

集合内所有元素的差

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 集合 |

Example

// 0
console.log(_.subtract([3, 2, 1]))

subtractBy ⇒ Number

集合内元素的差

接受一个函数作为第二参数,对集合内每个元素调用,用来决定求值的标准

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 集合 | | iterator | function | 迭代函数 |

Example

let obj = {
name: [1, 2, 3],
age: [4, 5, 6],
color: [7, 8, 9]
};

let objf = (o) => o[0];

// -10
console.log(_.subtractBy(obj, objf));



let arr = [
{age: 30},
{name: 'xxx'},
{age: 20}
];

let arrf = (o) => o.age;


// 10
console.log(_.subtractBy(arr, arrf));

sum ⇒ Number

集合内所有值的和

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 集合 |

Example

// 6
console.log(_.sum([1, 2, 3]))

sumBy ⇒ Number

集合内元素的和

接受一个函数作为第二参数,用来决定求值的标准

| Param | Type | Description | | --- | --- | --- | | collection | Array | Object | Map | Set | 一个集合 | | iterator | function | 用来迭代的函数 |

Example

let arr = [
{age: 30},
{name: 'xxx'},
{age: 20}
];

let arrf = (o) => o.age;

// 50
console.log(_.sumBy(arr, arrf))

swapIndex ⇒ Array | String

交换元素位置

交换数组或字符串元素的位置,对于数组,在数组本身修改,对于字符串,会返回新的字符串

| Param | Type | Description | | --- | --- | --- | | target | Array | String | 数组或字符串 | | i | Number | 索引 | | j | Number | 索引 |

Example

_.swapIndex([1, 2], 0, 1); // [2, 1]

_.swapIndex('abcd', 0, 3); // dbca

throttle ⇒ function

节流函数

Returns: function - 节流后的函数

| Param | Type | Description | | --- | --- | --- | | fn | function | 事件处理函数 | | time | Numer | 延时 |

Example

function go () {
        console.log('scroll');
}

window.addEventListener( 'scroll', _.throttle(go, 1000) );

toCurrency ⇒ String

将一个数字转化为以逗号分隔的货币形式的字符串

Returns: String - 货币形式的字符串

| Param | Type | Description | | --- | --- | --- | | num | Number | 一个数字 |

Example

//  123,456,789.123456
console.log( toCurrency(123456789.123456) );

toLower ⇒ any

将一个字符串或集合中的字符串转化为小写形式

会递归一个集合所有的深度,将它们的字符串值全部转化

| Param | Type | Description | | --- | --- | --- | | target | String | Object | Map | Array | 想要小写的字符串或集合 |

Example

let arr = ['AAA', ['BBB', ['CCC']]];

//  ['aaa', ['bbb', ['ccc']]];
console.log(_.toLower(arr));

toUpper ⇒ String | Array | Object | Map

将字符串或一个集合中的字符串大写,

该方法会递归一个集合的所有深度,将集合的所有字符串转化为大写形式

Returns: String | Array | Object | Map - 转化完成的字符串或集合

| Param | Type | Description | | --- | --- | --- | | target | String | Array | Object | Map | 想要大写的字符串或集合 |

Example

let arr = ['aaa', {name: 'davi'}, 20];

// ['AAA', {name: 'DAVI'}, 20]
console.log(_.toUpper(['aaa', { name: 'davi' }, 20]));

uniq ⇒ Array

数组去重

在原数组修改,返回修改后的数组

Returns: Array - 去重后的数组

| Param | Type | Description | | --- | --- | --- | | arr | Array | array |

Example

let arr = [1, 2, 1, 3, 2, 4];

_.uniq(arr);

// 1, 2, 3, 4
console.log(arr);

uniqBy ⇒ Array

数组去重

接受一个函数作为第二参数,用来决定去重的条件,在原数组去重

Returns: Array - 去重后的数组

| Param | Type | Description | | --- | --- | --- | | arr | Array | array | | iterator | function | 迭代函数 |

Example

let arr = [
{age: 30, name: 'a'},
{age: 20, name: 'b'},
{age: 30, name: 'c'},
{age: 10, name: 'd'},
{age: 90, name: 'e'},
{age: 10, name: 'f'},
];

_.uniqBy(arr, item => item.age);

console.log(arr);

unique ⇒ Array

去重函数

数组去重,不改变原数组,返回去重后的新数组

Returns: Array - 去重后的数组

| Param | Type | Description | | --- | --- | --- | | arr | Array | array |

Example

let arr = [1, 2, 3, 4, 1, 2, 3, 5];

_.unique(arr);  // [1, 2, 3, 4, 5]

upperFirst ⇒ String | Array | Object | Map

将字符串或一个集合中的字符串首字母大写,

该方法会递归一个集合的所有深度,将集合的所有字符串转化为首字母大写形式

Returns: String | Array | Object | Map - 转化完成的字符串或集合

| Param | Type | Description | | --- | --- | --- | | target | String | Array | Object | Map | 想要首字母大写的字符串或集合 |

Example

let arr = ['aaa', {name: 'davi'}, 20];

// ['Aaa', {name: 'Davi'}, 20];
console.log(_.upperFirst(arr));

withOut ⇒ Array

不改变原数组,返回一个去除给定值的新数组

返回一个新数组,其中包含所有不等于value的值

| Param | Type | Description | | --- | --- | --- | | arr | Array | array | | ...values | any | 想要移除的值 |

Example

let arr = [1, 1, 0, 2, 3 ,4 ,5 ,3, 6];

// [0, 2, 4, 5, 6]
console.log( _.withOut(arr, 1, 3) );