Lodash 是一個 JavaScript library,提供了很多常用的函式,處理資料可以省去很多時間,有時候也會比原生 JS 的效能還要好。
透過 npm
npm i --save lodash
import _ from 'lodash'
介紹幾個比較常用方法 參考 Document
參數
返回
範例
_.chunk(['a', 'b', 'c', 'd'], 2);
// => [['a', 'b'], ['c', 'd']]
參數
返回
false
、null
、0
、""
、undefined
和NaN
都是被認為是「假值」。)範例
_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]
參數
返回
範例
// 合併多個數組
const array1 = [1, 2];
const array2 = [3, 4];
const array3 = [5, 6];
const result = _.concat(array1, array2, array3);
console.log(result); // => [1, 2, 3, 4, 5, 6]
// 合併數組和其他值
const array = [1, 2];
const other = _.concat(array, 3, [4], 5);
console.log(other); // => [1, 2, 3, 4, 5]
// 合併多維數組
const array1 = [1, [2, 3]];
const array2 = [4, [5, 6]];
const result = _.concat(array1, array2);
console.log(result); // => [1, [2, 3], 4, [5, 6]]
// 合併空數組
const array = [1];
const emptyArray = [];
const result = _.concat(array, emptyArray);
console.log(result); // => [1]
參數
返回
範例
_.difference([3, 2, 1], [4, 2]);
// => [3, 1]
參數
返回
範例
const array1 = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }];
const array2 = [{ 'x': 3 }, { 'x': 4 }, { 'x': 5 }];
// 使用 'x' 屬性來屬性來確定對象唯一性
const difference = _.differenceBy(array1, array2, 'x');
console.log(difference); // => [{ 'x': 1 }, { 'x': 2 }]
參數
返回
範例
// 找大於30歲索引
const users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Charlie', age: 35 },
{ name: 'David', age: 40 }
];
const index = _.findIndex(users, (user) => user.age > 30);
console.log(index); // => 2
// 從索引1找大於30歲索引
const users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Charlie', age: 35 },
{ name: 'David', age: 40 }
];
const index = _.findIndex(users, (user) => user.age > 30, 1);
console.log(index); // => 2
參數
返回
範例
// 找等於30歲最後一筆索引
const users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Charlie', age: 35 },
{ name: 'David', age: 30 }
];
const index = _.findLastIndex(users, (user) => user.age === 30);
console.log(index); // => 3
// 從索引1找等於30歲最後一筆索引
const users = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Charlie', age: 35 },
{ name: 'David', age: 30 }
];
const index = _.findLastIndex(users, (user) => user.age === 30, 1);
console.log(index); // => 3
參數
返回
範例
_.head([1, 2, 3]);
// => 1
_.head([]);
// => undefined
參數
返回
範例
const nestedArray = [1, [2, [3, [4]], 5]];
const flatArray = _.flatten(nestedArray);
console.log(flatArray); // => [1, 2, [3, [4]], 5]
參數
返回
範例
const deeplyNestedArray = [1, [2, [3, [4]], 5]];
const fullyFlatArray = _.flattenDeep(deeplyNestedArray);
console.log(fullyFlatArray); // => [1, 2, 3, 4, 5]
參數
返回
範例
_.intersection([2, 1], [4, 2], [1, 2]);
// => [2]
參數
返回
範例
_.join(['a', 'b', 'c'], '~');
// => 'a~b~c'
參數
返回
範例
_.last([1, 2, 3]);
// => 3
參數
返回
範例
const array = [1, 2, 3, 1, 2, 3];
_.pull(array, 2, 3);
console.log(array);
// => [1, 1]
參數
返回
範例
const array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
_.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
console.log(array);
// => [{ 'x': 2 }]
參數
返回
範例
const array = [1, 2, 3, 4];
const evens = _.remove(array, function(n) {
return n % 2 == 0;
});
console.log(array);
// => [1, 3]
console.log(evens);
// => [2, 4]
參數
返回
範例
const array = [1, 2, 3, 4, 5];
// 從索引 1 到索引 3 之間 (不包括索引 3)
const slicedArray = _.slice(array, 1, 3);
console.log(slicedArray); // => [2, 3]
const array = [1, 2, 3, 4, 5];
// 從索引 2 到最後
const slicedArray = _.slice(array, 2);
console.log(slicedArray); // => [3, 4, 5]
參數
返回
範例
_.take([1, 2, 3]);
// => [1]
_.take([1, 2, 3], 2);
// => [1, 2]
_.take([1, 2, 3], 5);
// => [1, 2, 3]
_.take([1, 2, 3], 0);
// => []
參數
返回
範例
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = _.uniq(array);
console.log(uniqueArray); // => [1, 2, 3, 4, 5]
參數
返回
範例
const objects = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Charlie' },
{ id: 3, name: 'David' },
];
// 基于 'id' 属性來确定元素的唯一性
const uniqueObjects = _.uniqBy(objects, 'id');
console.log(uniqueObjects);
// => [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'David' } ]
參數
返回
範例
const numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
// 將元素的值分組,,並計算次數
const countByResult = _.countBy(numbers);
console.log(countByResult);
// => { '1': 1, '2': 2, '3': 3, '4': 4 }
參數
返回
範例
const array = [1, 2, 3, 4, 5];
_.forEach(array, (element) => {
console.log(element);
});
const object = { a: 1, b: 2, c: 3 };
_.forEach(object, (value, key) => {
console.log(key, value);
});
參數
返回
範例
const numbers = [1, 2, 3, 4, 5];
// 使用 _.every 檢查陣列中的所有元素是否都大於 0
const allPositive = _.every(numbers, (num) => num > 0);
console.log(allPositive); // => true
const students = {
Alice: { grade: 85 },
Bob: { grade: 92 },
Charlie: { grade: 78 },
};
// 使用 _.every 檢查所有學生的成績是否都大於等於 80
const allGoodGrades = _.every(students, (student) => student.grade >= 80);
console.log(allGoodGrades); // => false
參數
返回
範例
const numbers = [1, 2, 3, 4, 5];
// 使用 _.filter 篩選陣列中的所有偶數
const evenNumbers = _.filter(numbers, (num) => num % 2 === 0);
console.log(evenNumbers); // => [2, 4]
參數
返回
範例
const numbers = [1, 2, 3, 4, 5];
// 使用 _.find 找數組第一個偶數
const firstEvenNumber = _.find(numbers, (num) => num % 2 === 0);
console.log(firstEvenNumber); // => 2
參數
返回
範例
function duplicate(n) {
return [n, n];
}
_.flatMap([1, 2], duplicate);
// => [1, 1, 2, 2]
參數
返回
範例
const numbers = [1, 2, 3, 4, 5, 6];
// 使用 _.groupBy 根據元素的奇偶性分組
const groupedNumbers = _.groupBy(numbers, (num) => (num % 2 === 0) ? '偶數' : '奇數');
console.log(groupedNumbers);
/* 輸出:
{
'奇數': [1, 3, 5],
'偶數': [2, 4, 6]
}
*/
const students = {
Alice: { grade: 'A' },
Bob: { grade: 'B' },
Charlie: { grade: 'A' },
David: { grade: 'C' },
};
// 使用 _.groupBy 根據學生成績分組
const groupedStudents = _.groupBy(students, (student) => student.grade);
console.log(groupedStudents);
/* 輸出:
{
'A': [ { grade: 'A' }, { grade: 'A' } ],
'B': [ { grade: 'B' } ],
'C': [ { grade: 'C' } ]
}
*/
參數
返回
範例
_.includes([1, 2, 3], 1);
// => true
_.includes([1, 2, 3], 1, 2);
// => false
_.includes({ 'user': 'fred', 'age': 40 }, 'fred');
// => true
_.includes('pebbles', 'eb');
// => true
參數
返回
範例
const students = {
{ id: 1, name: 'Alice', grade: 'A' },
{ id: 2, name: 'Bob', grade: 'B' },
{ id: 3, name: 'Charlie', grade: 'A' },
{ id: 4, name: 'David', grade: 'C' },
};
// 使用 _.keyBy 根據學生的 id 屬性創建物件
const studentsById = _.keyBy(students, 'id');
console.log(studentsById);
/* 輸出:
{
'1': { id: 1, name: 'Alice', grade: 'A' },
'2': { id: 2, name: 'Bob', grade: 'B' },
'3': { id: 3, name: 'Charlie', grade: 'A' },
'4': { id: 4, name: 'David', grade: 'C' }
}
*/
參數
返回
範例
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = _.map(numbers, (num) => num * 2);
console.log(doubledNumbers); // => [2, 4, 6, 8, 10]
參數
返回
範例
const users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 34 },
{ 'user': 'fred', 'age': 40 },
{ 'user': 'barney', 'age': 36 }
];
// 以 `user` 升序排序 再 `age` 以降序排序。
_.orderBy(users, ['user', 'age'], ['asc', 'desc']);
// => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
參數
返回
範例
_.reduce([1, 2], function(sum, n) {
return sum + n;
}, 0);
// => 3
參數
返回
範例
_.size([1, 2, 3]);
// => 3
_.size({ 'a': 1, 'b': 2 });
// => 2
_.size('pebbles');
// => 7
參數
返回
範例
_.some([null, 0, 'yes', false], Boolean);
// => true
var users = [
{ 'user': 'barney', 'active': true },
{ 'user': 'fred', 'active': false }
];
// The `_.matches` iteratee shorthand.
_.some(users, { 'user': 'barney', 'active': false });
// => false
// The `_.matchesProperty` iteratee shorthand.
_.some(users, ['active', false]);
// => true
// The `_.property` iteratee shorthand.
_.some(users, 'active');
// => true
參數
返回
範例
const products = [
{ name: 'Apple', price: 2.5 },
{ name: 'Banana', price: 1.2 },
{ name: 'Orange', price: 3.0 },
{ name: 'Mango', price: 2.8 },
];
const sortedProducts = _.sortBy(products, (product) => product.price);
console.log(sortedProducts);
/* 輸出:
[
{ name: 'Banana', price: 1.2 },
{ name: 'Apple', price: 2.5 },
{ name: 'Mango', price: 2.8 },
{ name: 'Orange', price: 3.0 }
]
*/
參數
返回
範例
// 使用 Lodash 的 _.debounce 創建一個延遲執行的函數
const debouncedFunction = _.debounce((text) => {
console.log(`用戶輸入: ${text}`);
}, 500);
// 模擬用戶輸入
debouncedFunction('A');
debouncedFunction('B');
// 500 毫秒後只執行一次回調
// 輸出: 用戶輸入: B
參數
返回
範例
const objects = [{ 'a': 1 }, { 'b': 2 }];
const shallow = _.clone(objects);
console.log(shallow[0] === objects[0]);
// => true
參數
返回
範例
const objects = [{ 'a': 1 }, { 'b': 2 }];
const deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false
參數
返回
範例
_.isArray([1, 2, 3]);
// => true
_.isArray('abc');
// => false
參數
返回
範例
_.isBoolean(false);
// => true
_.isBoolean(null);
// => false
參數
返回
範例
_.isEmpty(null);
// => true
_.isEmpty(true);
// => true
_.isEmpty(1);
// => true
_.isEmpty([1, 2, 3]);
// => false
_.isEmpty({ 'a': 1 });
// => false
參數
返回
範例
const object = { 'a': 1 };
const other = { 'a': 1 };
_.isEqual(object, other);
// => true
object === other;
// => false
參數
返回
範例
_.isError(new Error);
// => true
_.isError(Error);
// => false
參數
返回
範例
_.isFunction(_);
// => true
_.isFunction(/abc/);
// => false
參數
返回
範例
_.isNaN(NaN);
// => true
_.isNaN(new Number(NaN));
// => true
isNaN(undefined);
// => true
_.isNaN(undefined);
// => false
參數
返回
範例
_.isNil(null);
// => true
_.isNil(void 0);
// => true
_.isNil(NaN);
// => false
參數
返回
範例
_.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
參數
返回
範例
_.isString('abc');
// => true
_.isString(1);
// => false
參數
返回
範例
_.isUndefined(void 0);
// => true
_.isUndefined(null);
// => false
參數
返回
範例
_.toArray({ 'a': 1, 'b': 2 });
// => [1, 2]
_.toArray('abc');
// => ['a', 'b', 'c']
_.toArray(1);
// => []
_.toArray(null);
// => []
參數
返回
範例
_.toNumber(3.2);
// => 3.2
_.toNumber(Number.MIN_VALUE);
// => 5e-324
_.toNumber(Infinity);
// => Infinity
_.toNumber('3.2');
// => 3.2
參數
返回
範例
_.toString(null);
// => ''
_.toString(-0);
// => '-0'
_.toString([1, 2, 3]);
// => '1,2,3'
參數
返回
範例
_.floor(4.006);
// => 4
_.floor(0.046, 2);
// => 0.04
_.floor(4060, -2);
// => 4000
參數
返回
範例
_.max([4, 2, 8, 6]);
// => 8
_.max([]);
// => undefined
參數
返回
範例
_.min([4, 2, 8, 6]);
// => 2
_.min([]);
// => undefined
參數
返回
範例
_.round(4.006);
// => 4
_.round(4.006, 2);
// => 4.01
_.round(4060, -2);
// => 4100
參數
返回
範例
_.sum([4, 2, 8, 6]);
// => 20
參數
返回
範例
_.random(0, 5);
// => an integer between 0 and 5
_.random(5);
// => also an integer between 0 and 5
_.random(5, true);
// => a floating-point number between 0 and 5
_.random(1.2, 5.2);
// => a floating-point number between 1.2 and 5.2
參數
返回
範例
const target = { a: 1, b: 2 };
const source = { b: 3, c: 4 };
// 使用 _.assign 將 source 對象的屬性複製到 target 對象
const mergedObject = _.assign(target, source);
console.log(mergedObject);
/* 輸出:
{
a: 1,
b: 3,
c: 4
}
*/
參數
返回
範例
const object = { 'a': [{ 'b': { 'c': 3 } }] };
_.get(object, 'a[0].b.c');
// => 3
_.get(object, ['a', '0', 'b', 'c']);
// => 3
_.get(object, 'a.b.c', 'default');
// => 'default'
參數
返回
範例
const object = { a: 1, b: 2, c: 3 };
const hasPropertyB = _.has(object, 'b');
console.log(hasPropertyB); // => true
參數
返回
範例
const object = { a: 1, b: 2, c: 3 };
const keys = _.keys(object);
console.log(keys); // => ['a', 'b', 'c']
參數
返回
範例
const originalObject = { firstName: 'Alice', lastName: 'Johnson' };
const newObject = _.mapKeys(originalObject, (value, key) => {
// 轉換大寫
return key.toUpperCase();
});
console.log(newObject);
/* 輸出:
{
FIRSTNAME: 'Alice',
LASTNAME: 'Johnson'
}
*/
參數
返回
範例
const originalObject = { a: 1, b: 2, c: 3 };
const newObject = _.mapValues(originalObject, (value) => {
return value * 2;
});
console.log(newObject);
/* 輸出:
{
a: 2,
b: 4,
c: 6
}
*/
參數
返回
範例
const object = {
'a': [{ 'b': 2 }, { 'd': 4 }]
};
const other = {
'a': [{ 'c': 3 }, { 'e': 5 }]
};
_.merge(object, other);
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
參數
返回
範例
const object = { 'a': 1, 'b': '2', 'c': 3 };
_.omit(object, ['a', 'c']);
// => { 'b': '2' }
參數
返回
範例
const object = { 'a': 1, 'b': '2', 'c': 3 };
_.omitBy(object, _.isNumber);
// => { 'b': '2' }
參數
返回
範例
const object = { 'a': 1, 'b': '2', 'c': 3 };
_.pick(object, ['a', 'c']);
// => { 'a': 1, 'c': 3 }
參數
返回
範例
const object = { 'a': 1, 'b': '2', 'c': 3 };
_.pickBy(object, _.isNumber);
// => { 'a': 1, 'c': 3 }
參數
返回
範例
const object = { 'a': [{ 'b': { 'c': 3 } }] };
_.set(object, 'a[0].b.c', 4);
console.log(object.a[0].b.c);
// => 4
_.set(object, ['x', '0', 'y', 'z'], 5);
console.log(object.x[0].y.z);
// => 5
參數
返回
範例
const numbers = [1, 2, 3, 4, 5];
const sum = _.transform(numbers, (result, num) => {
result.sum += num;
}, { sum: 0 });
console.log(sum); // => { sum: 15 }
參數
返回
範例
const object = { 'a': [{ 'b': { 'c': 7 } }] };
_.unset(object, 'a[0].b.c');
// => true
console.log(object);
// => { 'a': [{ 'b': {} }] };
_.unset(object, ['a', '0', 'b', 'c']);
// => true
console.log(object);
// => { 'a': [{ 'b': {} }] };
參數
返回
範例
const object = { a: 1, b: 2, c: 3 };
const values = _.values(object);
console.log(values); // => [1, 2, 3]
參數
返回
範例
_.replace('Hi Fred', 'Fred', 'Barney');
// => 'Hi Barney'
參數
返回
範例
_.split('a-b-c', '-', 2);
// => ['a', 'b']
參數
返回
範例
_.trim(' abc ');
// => 'abc'
_.trim('-_-abc-_-', '_-');
// => 'abc'
_.map([' foo ', ' bar '], _.trim);
// => ['foo', 'bar']
參數
返回
範例
const idsStr = _.flow(
() => _.map(listings, 'id'),
ids => _.join(ids, ',')
)()
參數
返回
範例
_.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);
// => []
參數
返回
範例
_.times(3, String);
// => ['0', '1', '2']
_.times(4, _.constant(0));
// => [0, 0, 0, 0]
關於 Lodash 筆記會持續更新~