Home Web Front-end JS Tutorial Relevant usage of js array reduce

Relevant usage of js array reduce

Jun 13, 2018 pm 02:24 PM
js array

This article has compiled a lot of classic code snippets about the js array method reduce, which can help you better understand the use of reduce examples. Let’s learn together.

The following are some relevant code snippets about the javascript array methodreduce that I collected and summarized at work. When encountering other scenarios where this function is used, they will be added one after another. Here is a backup forget. There are so many methods for

javascript arrays. Why do I single out the reduce method? One reason is that I don’t know enough about this method to use it as I like. On the other hand, I also feel the huge charm of this method, which plays a magical role in many scenes.

UnderstandingreduceFunction

reduce() method receives a function as an accumulator (accumulator), and each value in the array starts to decrease (from left to right). Finally a value.

arr.reduce([callback, initialValue])
Copy after login

Look at the following example:

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);
Copy after login

Fragment 1: Alphabet Game

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"); // 结果会是什么呢?
Copy after login

reduceResponsible The first letter of each execution is filtered out, and recursion is responsible for the arrangement and combination of the remaining letters.

Fragment Two: Accumulator

const sum = arr => arr.reduce((acc, val) => acc + val, 0);
sum([1, 2, 3]);
Copy after login

Fragment Three: Counter

const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
countOccurrences([1, 2, 3, 2, 2, 5, 1], 1);
Copy after login

Loop through the array. Every time a value is equal to the given value, 1 is added, and the result after addition is used as the initial value for the next time.

Fragment 4: Function Currying

The purpose of function currying is to store data and then execute it in the last step.

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);
Copy after login

Get the length of the current function by judging the parameters of the function (of course you can also specify it yourself). If the parameters passed are less than the current parameters, continue to recurse and store the previous time. parameters passed.

Fragment Five: Array Flattening

const deepFlatten = arr => 
 arr.reduce((a, v) => a.concat(Array.isArray(v) ? deepFlatten(v) : v), []);
deepFlatten([1, [2, [3, 4, [5, 6]]]]);
Copy after login

Fragment Six: Generating Fibo Reci Array

const fibonacci = n => Array(n).fill(0).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
fibonacci(5);
Copy after login

Fragment 7: Pipe Processor

const pipe = (...funcs) => arg => funcs.reduce((acc, func) => func(acc), arg);
pipe(btoa, x => x.toUpperCase())("Test");
Copy after login

Performs function processing on the passed parameters, and then uses the processed data as The parameters of the next function are passed layer by layer in this way.

Fragment 8: Application of the classic compose function in middleware

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>const dispatch = action =&gt; { console.log(&amp;#39;action&amp;#39;, action); return action; } const middleware1 = dispatch =&gt; { return action =&gt; { console.log(&quot;middleware1&quot;); const result = dispatch(action); console.log(&quot;after middleware1&quot;); return result; } } const middleware2 = dispatch =&gt; { return action =&gt; { console.log(&quot;middleware2&quot;); const result = dispatch(action); console.log(&quot;after middleware2&quot;); return result; } } const middleware3 = dispatch =&gt; { return action =&gt; { console.log(&quot;middleware3&quot;); const result = dispatch(action); console.log(&quot;after middleware3&quot;); return result; } } const compose = middlewares =&gt; middlewares.reduce((a, b) =&gt; args =&gt; a(b(args))) const middlewares = [middleware1, middleware2, middleware3]; const afterDispatch = compose(middlewares)(dispatch); const testAction = arg =&gt; { return { type: &quot;TEST_ACTION&quot;, params: arg }; }; afterDispatch(testAction(&quot;1111&quot;));</pre><div class="contentsignin">Copy after login</div></div>redux In this way, through multiple layers of middleware, function execution is triggered when the action is actually initiated.

Fragment 9: Redux-actions processing of state Fragment

// 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);
}
Copy after login

Fragment 10: Data processor

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);
Copy after login

Fragment 11: Object null value judgment

let school = {
 name: &#39;Hope middle school&#39;,
 created: &#39;2001&#39;,
 classes: [
  {
   name: &#39;三年二班&#39;,
   teachers: [
    { name: &#39;张二蛋&#39;, age: 26, sex: &#39;男&#39;, actor: &#39;班主任&#39; },
    { name: &#39;王小妞&#39;, age: 23, sex: &#39;女&#39;, actor: &#39;英语老师&#39; }
   ]
  },
  {
   name: &#39;明星班&#39;,
   teachers: [
    { name: &#39;欧阳娜娜&#39;, age: 29, sex: &#39;女&#39;, actor: &#39;班主任&#39; },
    { name: &#39;李易峰&#39;, age: 28, sex: &#39;男&#39;, actor: &#39;体育老师&#39; },
    { name: &#39;杨幂&#39;, age: 111, sex: &#39;女&#39;, actor: &#39;艺术老师&#39; }
   ]
  }
 ]
};
// 常规做法
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([&#39;classes&#39;, 0, &#39;teachers&#39;, 0, &#39;name&#39;], school); // 张二蛋
Copy after login

Fragment 12: Grouping

const groupBy = (arr, func) =>
arr.map(typeof func === &#39;function&#39; ? 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([&#39;one&#39;, &#39;two&#39;, &#39;three&#39;], &#39;length&#39;);
Copy after login

First calculate all the key values ​​​​through map, and then classify them according to the created values

Fragment ten Three: Object filtering

const pick = (obj, arr) =>
arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
Copy after login

Traverse according to the given key value, compare whether there is a value with the same key value in the object, and then assign the assigned object to The next initial value

Fragment 14: Delete the value at the specified position in the array

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);
Copy after login

First based on filter The function filters out the qualified values ​​in the array, and then uses reduce to delete the qualified values ​​in the original array. It can be concluded that the final value of arr becomes [1, 3]

Fragment 15: promises are executed in order

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(&#39;hello&#39;)]);
Copy after login

Fragment 16: Sorting

const orderBy = (arr, props, orders) =>
 [...arr].sort((a, b) =>
  props.reduce((acc, prop, i) => {
   if (acc === 0) {
    const [p1, p2] = orders && orders[i] === &#39;desc&#39; ? [b[prop], a[prop]] : [a[prop], b[prop]];
    acc = p1 > p2 ? 1 : p1 < p2 ? -1 : 0;
   }
   return acc;
  }, 0)
 );
const users = [{ name: &#39;fred&#39;, age: 48 }, { name: &#39;barney&#39;, age: 36 }, { name: &#39;fly&#39;, age: 26 }];
orderBy(users, [&#39;name&#39;, &#39;age&#39;], [&#39;asc&#39;, &#39;desc&#39;]); 
orderBy(users, [&#39;name&#39;, &#39;age&#39;]);
Copy after login

Fragment Seventeen: Selection

const select = (from, selector) =>
 selector.split(&#39;.&#39;).reduce((prev, cur) => prev && prev[cur], from);
const obj = { selector: { to: { val: &#39;val to select&#39; } } };
select(obj, &#39;selector.to.val&#39;);
Copy after login

The above is what I compiled for everyone. I hope it will be helpful to everyone in the future.

Related articles:

Detailed interpretation of how Vue configures the packaging tool

How to implement watch to automatically detect data changes in Vue

How to load the permission management module (detailed tutorial)

How to implement communication in vue2.0?

What are the methods of Angular 2 style binding

The above is the detailed content of Relevant usage of js array reduce. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to remove elements from es6 array How to remove elements from es6 array Jan 11, 2023 pm 03:51 PM

Method: 1. Use shift() to delete the first element, the syntax is "array.shift()"; 2. Use pop() to delete the last element, the syntax is "array.pop()"; 3. Use splice() to delete Elements at any position, the syntax is "array.splice(position, number)"; 4. Use length to delete the last N elements, the syntax is "array.length=original array length-N"; 5. Directly assign the empty array "[ ]" to clear the element; 6. Use delete to delete an element at the specified subscript.

How to convert string to array in javascript How to convert string to array in javascript Nov 23, 2022 pm 07:28 PM

3 conversion methods: 1. Use split() to split a given string into a string array, the syntax is "str.split (separator, maximum length of array)"; 2. Use the expansion operator "... ", iterable string object, convert it into a character array, the syntax "[...str]"; 3. Use Array.from() to convert the string into an array, the syntax "Array.from(str) ".

How to get the length of an array in js How to get the length of an array in js Jun 20, 2023 pm 05:33 PM

Getting the length of an array in JS is very simple. Each array has a length property, which returns the maximum length of the array, that is, its value is equal to the maximum subscript value plus 1. Since numeric subscripts must be less than 2^32-1, the maximum value of the length attribute is equal to 2^32-1. The following code defines an empty array, and then assigns a value to the element with the index equal to 100, then the length property returns 101. Therefore, the length attribute cannot reflect the actual number of array elements.

Can js array be converted into php array? Can js array be converted into php array? Jun 02, 2023 am 10:06 AM

The js array can be converted into a php array. The operation method is: 1. Create a php sample file; 2. Use the syntax "JSON.stringify()" to convert the js array into a string in JSON format; 3. Use the syntax "json_decode()" "Convert the JSON format string to a PHP array. The parameter true is added here, which means that the JSON format string is converted into a PHP associative array.

There are several ways to delete an element from a js array There are several ways to delete an element from a js array Aug 02, 2023 am 10:09 AM

There are 4 ways to delete an element from a js array, namely: 1. Use splice; 2. Use filter; 3. Use the pop method and shift; 4. Use the delete keyword.

JS array sorting: how to use the sort() method JS array sorting: how to use the sort() method Dec 27, 2023 pm 03:40 PM

JavaScript's Array.prototype.sort() method is used to sort the elements of an array. This method sorts in place, that is, it modifies the original array rather than returning a new sorted array. By default, the sort() method sorts strings according to their Unicode code point values. This means that it is used primarily for sorting strings and numbers, rather than for sorting objects or other complex data types.

What are the methods to remove duplicates from js arrays? What are the methods to remove duplicates from js arrays? Aug 09, 2023 pm 04:47 PM

Methods to deduplicate js arrays include using Set, using indexOf, using includes, using filter and using reduce. 1. Use Set, which is characterized by the fact that the elements in the set will not be repeated; 2. Use indexOf to return the first index position of the specified element in the array; 3. Use includes to determine whether an element already exists in the array. 4. Use filter to filter elements; 5. Use reduce to compress elements in an array, etc.

How to find the length and sum of elements of an array in JavaScript How to find the length and sum of elements of an array in JavaScript Sep 20, 2022 pm 02:11 PM

In JavaScript, you can use the length attribute to get the length of the array, the syntax is "array object.length"; you can use the reduce() or reduceRight() function to find the sum of elements, the syntax is "arr.reduce(function f(pre,curr){ return pre+cur})" or "arr.reduceRight(function f(pre,curr){return pre+cur})".

See all articles