Tổng hợp các Lodash functions mà chúng ta nên biết tới
Bài đăng này đã không được cập nhật trong 4 năm
Lời nói đầu
Xin chào mọi người, nếu các bạn đã hoặc đang làm việc với javascript thì chắc hẳn đã biết đến Lodash. Đây là thư viện mạnh mẽ cung cấp performance rất cao với rất nhiều hàm để xử lý data, object, strings, number, array.... Ngoài ra, khi sử dụng Lodash chúng ta thấy code ngắn gọn, tiết kiệm thời gian và dễ maintain hơn. Thú thật là từ khi được join dự án ở công ty và làm quen với Lodash thì mình bị nghiện luôn, setup project nào cũng require Lodash vì nó rất là tiện :v
Lodash cung cấp cho chúng ta khá nhiều chức năng đa dạng, và được chia thành các nhóm như sau:
- Array
- Collection
- Date
- Function
- Lang
- Math
- Number
- Seq
- String
- Util
- Properties
- Methods
Giờ thì bạn hãy cài đặt Lodash và mình sẽ liệt kê ra một số lodash functions được sử dụng rất nhiều trong bất kỳ dự án nào có javascript nhé 
Cài đặt
Với browser:
<script src="lodash.js"></script>
Sử dụng npm:
$ npm i -g npm
$ npm i --save lodash
Trong Node.js:
// Load the full build.
var _ = require('lodash');
// Load the core build.
var _ = require('lodash/core');
// Load the FP build for immutable auto-curried iteratee-first data-last methods.
var fp = require('lodash/fp');
// Load method categories.
var array = require('lodash/array');
var object = require('lodash/fp/object');
// Cherry-pick methods for smaller browserify/rollup/webpack bundles.
var at = require('lodash/at');
var curryN = require('lodash/fp/curryN');
Những function phổ biến
Object
1 _.get
_.get(object, path, [defaultValue])
_.get sẽ lấy value theo path của object, nếu value là undefined thì trả về defaultValue.
var object = { 'a': [{ 'b': { 'c': 100 } }] };
_.get(object, 'a[0].b.c');
// => 100
_.get(object, ['a', '0', 'b', 'c']);
// => 100
_.get(object, 'a.b.c', 'default');
// => 'default'
2 _.set
_.set(object, path, value)
_.set sẽ đặt một object với value mà bạn mong muốn. Bạn có thể truy cập vào một thuộc tính với đường dẫn path của nó. Nếu đường dẫn path không tồn tại, một object sẽ được tạo mới.
var object = { 'a': [{ 'b': { 'c': 100 } }] };
_.set(object, 'a[0].b.c', 200);
console.log(object.a[0].b.c); // path exist
// => 200
_.set(object, ['x', '0', 'y', 'z'], 500);
console.log(object.x[0].y.z); // path doesn't exist
// => 500
3 _.findKey
_.findKey(object, [predicate=_.identity])
._findKey sẽ trả về key của element đầu tiên thoả mãn được điều kiện của hàm callback ở tham số thứ 2.
var users = {
'barney': { 'age': 36, 'active': true },
'fred': { 'age': 40, 'active': false },
'pebbles': { 'age': 1, 'active': true }
};
_.findKey(users, function(o) { return o.age < 40; });
// => 'barney'
// The `_.matches` iteratee shorthand.
_.findKey(users, { 'age': 1, 'active': true });
// => 'pebbles'
// The `_.matchesProperty` iteratee shorthand.
_.findKey(users, ['active', false]);
// => 'fred'
// The `_.property` iteratee shorthand.
_.findKey(users, 'active');
// => 'barney'
4 _.mapValues
_.mapValues(object, [iteratee=.identity])
_.mapValues sẽ trả về 1 object mới bằng cách lặp qua các element của object và value mới là kết quả xử lý trong hàm callback ở tham số thứ 2.
var users = {
'fred': { 'user': 'fred', 'age': 40 },
'pebbles': { 'user': 'pebbles', 'age': 1 }
};
_.mapValues(users, function(o) { return o.age; });
// => { 'fred': 40, 'pebbles': 1 }
// The `_.property` iteratee shorthand.
_.mapValues(users, 'age');
// => { 'fred': 40, 'pebbles': 1 }
5 _.extend, _.assign and _.merge
Cả 3 hàm này đều thực hiện một chức năng là hợp nhất các object. Tuy nhiên, có một chút khác biệt.
_.extend/_.assign/_.merge(object, [sources])
_.extend là alias của _.assign, 2 hàm này giống nhau. Điểm khác nhau là _.assign và _.extend sẽ overwrite giá trị undefined, còn _.merge thì không.
_.assign ({}, { a: 'a' }, { a: undefined }) // => { a: undefined }
_.merge ({}, { a: 'a' }, { a: undefined }) // => { a: "a" }
Array
6 _.chunk
_.chunk(array, [size=option])
_.chunk tạo một mảng mới từ mảng đã có, gồm các mảng con có số phần tử tùy chọn truyền vào.
_.chunk(['a', 'b', 'c', 'd'], 2);
// => [['a', 'b'], ['c', 'd']]
_.chunk(['a', 'b', 'c', 'd'], 3);
// => [['a', 'b', 'c'], ['d']]
7 _.difference
_.difference(array, [values])
_.difference sẽ tạo một mảng chứa những phần tử khác nhau của hai array.
_.difference([2, 1], [2, 3]);
// => [1]
8 _.intersection
_.intersection([arrays])
_.intersection sẽ lấy ra những phần tử giống nhau giữa 2 hay nhiều mảng.
_.intersection([2, 1], [2, 3]);
// => [2]
9 _.drop
_.drop(array, [n=1])
_.drop sẽ tạo một mảng mới với việc xóa bỏ các phần từ vị trí đầu tiên đến vị trí thứ n, mặc định là n=1.
_.drop([1, 2, 3]);
// => [2, 3]
_.drop([1, 2, 3], 2);
// => [3]
_.drop([1, 2, 3], 5);
// => []
_.drop([1, 2, 3], 0);
// => [1, 2, 3]
10 _.findIndex
_.findIndex(array, [predicate=.identity], [fromIndex=0])
_.findIndex sẽ trả về index của element đầu tiên thoả mãn được điều kiện của tham số thứ 2.
var users = [
{ 'user': 'barney', 'active': false },
{ 'user': 'fred', 'active': false },
{ 'user': 'pebbles', 'active': true }
];
_.findIndex(users, function(o) { return o.user == 'barney'; });
// => 0
// The `_.matches` iteratee shorthand.
_.findIndex(users, { 'user': 'fred', 'active': false });
// => 1
// The `_.matchesProperty` iteratee shorthand.
_.findIndex(users, ['active', false]);
// => 0
// The `_.property` iteratee shorthand.
_.findIndex(users, 'active');
// => 2
Collection
11 _.filter
_.filter(collection, [predicate=.identity])
_.filter sẽ lặp qua tất cả các element và trả về 1 array gồm tất cả element thoả mãn điều kiện của hàm callback ở tham số thứ 2.
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false }
];
_.filter(users, function(o) { return !o.active; });
// => objects for ['fred']
// The `_.matches` iteratee shorthand.
_.filter(users, { 'age': 36, 'active': true });
// => objects for ['barney']
// The `_.matchesProperty` iteratee shorthand.
_.filter(users, ['active', false]);
// => objects for ['fred']
// The `_.property` iteratee shorthand.
_.filter(users, 'active');
// => objects for ['barney']
12 _.find
_.find(collection, [predicate=.identity], [fromIndex=0])
_.find sẽ lặp qua tất cả các element và trả về element đầu tiên thoả mãn điều kiện của hàm callback ở tham số thứ 2 chứ không như _.filter sẽ lấy tất cả element thỏa mãn.
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1, 'active': true }
];
_.find(users, function(o) { return o.age < 40; });
// => object for 'barney'
// The `_.matches` iteratee shorthand.
_.find(users, { 'age': 1, 'active': true });
// => object for 'pebbles'
// The `_.matchesProperty` iteratee shorthand.
_.find(users, ['active', false]);
// => object for 'fred'
// The `_.property` iteratee shorthand.
_.find(users, 'active');
// => object for 'barney'
13 _.includes
_.includes(collection, value, [fromIndex=0])
_.includes sẽ tìm kiếm value có thuộc collection hay không, nếu có thì trả về true, ngược lại trả về false.
_.includes([1, 2, 3], 1);
// => true
_.includes([1, 2, 3], 1, 2);
// => false
_.includes({ 'a': 1, 'b': 2 }, 1);
// => true
_.includes('abcd', 'bc');
// => true
14 _.forEach
_.forEach(collection, [iteratee=.identity])
_.forEach sẽ tương tự với hàm foreach() mà chúng ta hay sử dụng, nó dùng để lặp qua mỗi phần tử của collection và xử lý với hàm callback.
_.forEach([1, 2], function(value) {
console.log(value);
});
// => Logs `1` then `2`.
_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
console.log(key);
});
// => Logs 'a' then 'b' (iteration order is not guaranteed).
15 _.map
_.map(collection, [iteratee=.identity])
_.map cũng giống với foreach lặp qua các phần tử trong danh sách nhưng khác là nó sẽ trả về một danh sách mới.
function square(n) {
return n * n;
}
_.map([4, 8], square);
// => [16, 64]
_.map({ 'a': 4, 'b': 8 }, square);
// => [16, 64] (iteration order is not guaranteed)
var users = [
{ 'user': 'barney' },
{ 'user': 'fred' }
];
// The `_.property` iteratee shorthand.
_.map(users, 'user');
// => ['barney', 'fred']
Function
16 _.delay
_.delay(func, wait, [args])
_.delay sẽ gọi function sau khi đợi một khoảng thời gian tùy chỉnh. Có thể truyền các đối số args vào func.
_.delay(function(text) {
console.log(text);
}, 1000, 'later');
// => Logs 'later' after one second.
17 _.debounce
_.debounce(func, [wait=0], [options={}])
_.debounce sẽ gọi lại một function sau một khoảng thời gian nhất định kể từ lần cuối cùng function đó được gọi.
function validate() {
// Validate and show error message if not valid
}
var input = document.getElementById("input-field");
input.addEventListener("keyup", _.debounce(validate, 200));
Ở đây, thông báo lỗi sẽ không được hiển thị ngay lập tức vì validate() sẽ được gọi sau 200ms. Khoảng thời gian đếm ngược 200ms sẽ reset mỗi khi người dùng nhập input. Vì thế người dùng sẽ không nhìn thấy thông báo lỗi cho đến khi thôi nhập.
Lang
Dưới đây là một số function được dùng để kiểm tra kiểu, giá trị của biến, và một số hàm dùng để convert dữ liệu:
_.isNull(null);
// ➜ true
_.isNull(void 0);
// ➜ false
_.isNumber(3);
// ➜ true
_.isNumber(Number.MIN_VALUE);
// ➜ true
_.isNumber(Infinity);
// ➜ true
_.isNumber('3');
// ➜ false
_.isObject({});
// ➜ true
_.isObject([1, 2, 3]);
// ➜ true
_.isObject(_.noop);
// ➜ true
_.isObject(null);
// ➜ false
_.isUndefined(void 0);
// ➜ true
_.isUndefined(null);
// ➜ false
_.isDate(new Date);
// ➜ true
_.isDate('Mon April 23 2012');
// ➜ false
_.toArray('abc');
// => ['a', 'b', 'c']
_.toString([1, 2, 3]);
// => '1,2,3'
_.toFinite(Number.MIN_VALUE);
// => 5e-324
_.toInteger(3.2);
// => 3
_.toLength(Infinity);
// => 4294967295
Tổng kết
Trên đây chỉ là một số ít các function mà Lodash xây dựng sẵn để hỗ trợ cho chúng ta. Còn rất nhiều các function hay ho khác mà mình không thể nào liệt kê hết ra đây được, tuy nhiên trong quá trình làm việc với nó thì đây là những function mà mình sử dụng nhiều nhất. Các bạn hãy vào document của Lodash để tham khảo và thực hành thêm nhé 
All rights reserved