js數組reduce的相關用法
本文為大家整理了許多關於js數組方法reduce的經典程式碼片段,能夠讓大家更好的理解reduce的實例用法,一起學習下吧。
以下是個人在工作中收藏總結的一些關於javascript數組方法reduce
的相關程式碼片段,後續遇到其他使用這個函數的場景,將會陸續添加,這裡作為備忘。
javascript數組那麼多方法,為什麼我要單挑reduce
方法,一個原因是我對這個方法掌握不夠,不能夠用到隨心所欲。另一個方面,我也感覺到了這個方法的龐大魅力,在許多的場景中發揮著神奇的作用。
理解reduce
函數
reduce() 方法接收一個函數為累加器(accumulator),陣列中的每個值(從左到右)開始縮減,最終為一個值。
arr.reduce([callback, initialValue])
看如下例子:
let arr = [1, 2, 3, 4, 5]; // 10代表初始值,p代表每一次的累加值,在第一次为10 // 如果不存在初始值,那么p第一次值为1 // 此时累加的结果为15 let sum = arr.reduce((p, c) => p + c, 10); // 25 // 转成es5的写法即为: var sum = arr.reduce(function(p, c) { console.log(p); return p + c; }, 10);
片段一:字母遊戲
const anagrams = str => { if (str.length <= 2) { return str.length === 2 ? [str, str[1] + str[0]] : str; } return str.split("").reduce((acc, letter, i) => { return acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)); }, []); } anagrams("abc"); // 结果会是什么呢?
reduce
負責篩選出每一次執行的首字母,遞歸負責剩下字母的排列組合。
片段二:累加器
const sum = arr => arr.reduce((acc, val) => acc + val, 0); sum([1, 2, 3]);
片段三:計數器
const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); countOccurrences([1, 2, 3, 2, 2, 5, 1], 1);
循環數組,每遇到一個值與給定值相等,即加1,同時將加上之後的結果作為下次的初始值。
片段四:函數柯里化
函數柯里化的目的就是為了儲存數據,然後在最後一步執行。
const curry = (fn, arity = fn.length, ...args) => arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); curry(Math.pow)(2)(10); curry(Math.min, 3)(10)(50)(2);
透過判斷函數的參數來取得目前函數的length
(當然也可以自己指定),如果所傳的參數比目前參數少,則繼續遞歸下面,同時儲存上一次傳遞的參數。
片段五:陣列扁平化
const deepFlatten = arr => arr.reduce((a, v) => a.concat(Array.isArray(v) ? deepFlatten(v) : v), []); deepFlatten([1, [2, [3, 4, [5, 6]]]]);
片段六:產生菲波列契陣列
const fibonacci = n => Array(n).fill(0).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []); fibonacci(5);
片段七:管道加工器
const pipe = (...funcs) => arg => funcs.reduce((acc, func) => func(acc), arg); pipe(btoa, x => x.toUpperCase())("Test");
透過對傳遞的參數進行函數加工,之後將加工之後的資料作為下一個函數的參數,這樣層層傳遞下去。
片段八:中間件
const dispatch = action => { console.log('action', action); return action; } const middleware1 = dispatch => { return action => { console.log("middleware1"); const result = dispatch(action); console.log("after middleware1"); return result; } } const middleware2 = dispatch => { return action => { console.log("middleware2"); const result = dispatch(action); console.log("after middleware2"); return result; } } const middleware3 = dispatch => { return action => { console.log("middleware3"); const result = dispatch(action); console.log("after middleware3"); return result; } } const compose = middlewares => middlewares.reduce((a, b) => args => a(b(args))) const middlewares = [middleware1, middleware2, middleware3]; const afterDispatch = compose(middlewares)(dispatch); const testAction = arg => { return { type: "TEST_ACTION", params: arg }; }; afterDispatch(testAction("1111"));
#redux
中經典的compose
函數中運用了這種方式,透過對中間件的重重層疊,在真正發起action的時候觸發函數執行。
片段九:redux-actions對state的加工片段
#// redux-actions/src/handleAction.js const handleAction = (type, reducer, defaultState) => { const types = type.toString(); const [nextReducer, throwReducer] = [reducer, reducer]; return (state = defaultState, action) => { const { type: actionType } = action; if (!actionType || types.indexOf(actionType.toString()) === -1) { return state; } return (action.error === true ? throwReducer : nextReducer)(state, action); } } // reduce-reducers/src/index.js const reduceReducer = (...reducers) => { return (previous, current) => { reducers.reduce((p, r) => r(p, current), previous); } } // redux-actions/src/handleActions.js const handleActions = (handlers, defaultState, { namespace } = {}) => { // reducers的扁平化 const flattenedReducerMap = flattenReducerMap(handles, namespace); // 每一种ACTION下对应的reducer处理方式 const reducers = Reflect.ownkeys(flattenedReducerMap).map(type => handleAction( type, flattenedReducerMap[type], defaultState )); // 状态的加工器,用于对reducer的执行 const reducer = reduceReducers(...reducers); // reducer触发 return (state = defaultState, action) => reducer(state, action); }
##片段十:資料處理器
const reducers = { totalInEuros: (state, item) => { return state.euros += item.price * 0.897424392; }, totalInYen: (state, item) => { return state.yens += item.price * 113.852; } }; const manageReducers = reducers => { return (state, item) => { return Object.keys(reducers).reduce((nextState, key) => { reducers[key](state, item); return state; }, {}) } } const bigTotalPriceReducer = manageReducers(reducers); const initialState = { euros: 0, yens: 0 }; const items = [{ price: 10 }, { price: 120 }, { price: 1000 }]; const totals = items.reduce(bigTotalPriceReducer, initialState);
片段十一:物件空值判斷#
let school = { name: 'Hope middle school', created: '2001', classes: [ { name: '三年二班', teachers: [ { name: '张二蛋', age: 26, sex: '男', actor: '班主任' }, { name: '王小妞', age: 23, sex: '女', actor: '英语老师' } ] }, { name: '明星班', teachers: [ { name: '欧阳娜娜', age: 29, sex: '女', actor: '班主任' }, { name: '李易峰', age: 28, sex: '男', actor: '体育老师' }, { name: '杨幂', age: 111, sex: '女', actor: '艺术老师' } ] } ] }; // 常规做法 school.classes && school.classes[0] && school.classes[0].teachers && school.classes[0].teachers[0] && school.classes[0].teachers[0].name // reduce方法 const get = (p, o) => p.reduce((xs, x) => (xs && xs[x] ? xs[x] : null), o); get(['classes', 0, 'teachers', 0, 'name'], school); // 张二蛋
##片段十二:分組const groupBy = (arr, func) =>
arr.map(typeof func === 'function' ? func : val => val[func]).reduce((acc, val, i) => {
acc[val] = (acc[val] || []).concat(arr[i]);
return acc;
}, {});
groupBy([6.1, 4.2, 6.3], Math.floor);
groupBy(['one', 'two', 'three'], 'length');
計算出所有的鍵值,然後再根據建值進行歸類
const pick = (obj, arr) =>
arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
const remove = (arr, func) =>
Array.isArray(arr)
? arr.filter(func).reduce((acc, val) => {
arr.splice(arr.indexOf(val), 1);
return acc.concat(val);
}, []) : [];
const arr = [1, 2, 3, 4];
remove(arr, n => n % 2 == 0);
reduce在原始數組中刪除符合條件的值,可以得到最後arr的值變成了[1, 3]
const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve());
const delay = d => new Promise(r => setTimeout(r, d));
const print = args => new Promise(r => r(args));
runPromisesInSeries([() => delay(1000), () => delay(2000), () => print('hello')]);
##const orderBy = (arr, props, orders) =>
[...arr].sort((a, b) =>
props.reduce((acc, prop, i) => {
if (acc === 0) {
const [p1, p2] = orders && orders[i] === 'desc' ? [b[prop], a[prop]] : [a[prop], b[prop]];
acc = p1 > p2 ? 1 : p1 < p2 ? -1 : 0;
}
return acc;
}, 0)
);
const users = [{ name: 'fred', age: 48 }, { name: 'barney', age: 36 }, { name: 'fly', age: 26 }];
orderBy(users, ['name', 'age'], ['asc', 'desc']);
orderBy(users, ['name', 'age']);
以上是js數組reduce的相關用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!const select = (from, selector) =>
selector.split('.').reduce((prev, cur) => prev && prev[cur], from);
const obj = { selector: { to: { val: 'val to select' } } };
select(obj, 'selector.to.val');

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

方法:1、用shift()刪除第一個元素,語法「陣列.shift()」;2、用pop()刪除最後一個元素,語法「陣列.pop()」;3、用splice()刪除任意位置的元素,語法「數組.splice(位置,個數)」;4、用length刪除尾部的N個元素,語法「數組.length=原數組長度-N」;5、直接賦予空數組「[ ]」來清空元素;6、用delete刪除指定下標的一個元素。

js數組可以轉換成php數組,其操作方法為:1、建立php範例檔;2、使用語法「JSON.stringify()」將js數組轉換為JSON格式的字串;3、使用語法「json_decode() 」將JSON格式字串轉為PHP數組,此處新增了參數true,表示將JSON格式字串轉換成PHP關聯數組。

3種轉換方法:1、使用split(),可將給定字串拆分為字串數組,語法「str.split(分隔符號,數組最大長度)」;2、利用擴展運算子「... ”,可迭代字串對象,將其轉為字元數組,語法“[...str]”;3、使用Array.from(),可將字串轉為數組,語法“Array.from(str) 」。

在 JS 中取得數組長度非常簡單,每個數組都有一個 length 屬性,該屬性傳回數組的最大長度,即其值等於最大下標值加 1。由於數字下標必須小於 2^32-1,所以 length 屬性最大值等於 2^32-1。下面程式碼定義了一個空數組,然後為下標等於 100 的元素賦值,則 length 屬性傳回 101。因此,length 屬性不能體現陣列元素的實際個數。

js陣列刪除某個元素有4種方法,分別是:1、使用splice;2、使用filter;3、使用pop方法和shift;4、使用delete關鍵字。

JavaScript的Array.prototype.sort()方法用於對陣列的元素進行排序。此方法是就地排序,也就是說,它修改原始數組,而不是傳回一個新的排序數組。預設情況下,sort()方法會依照字串Unicode碼點值進行排序。這意味著它主要用於字串和數字的排序,而不是用於物件或其他複雜資料類型的排序。

js數組去重的方法有使用Set、使用indexOf、使用includes、使用filter和使用reduce。 1.使用Set,特點是集合中的元素不會重複;2、使用indexOf,可以傳回指定元素在數組中的第一個索引位置;3、使用includes,可以用來判斷一個元素是否已經存在於數組中;4、使用filter,可以用來篩選元素;5、使用reduce,可以將陣列中的元素壓縮等等。

JavaScript中,可利用length屬性來取得數組長度,語法「數組物件.length」;可使用reduce()或reduceRight()函數來求元素總和,語法「arr.reduce(function f(pre,curr){ return pre+cur})」或「arr.reduceRight(function f(pre,curr){return pre+cur})」。
