>  기사  >  웹 프론트엔드  >  JS의 배열 축소 방법에 대한 심층 분석(코드 포함)

JS의 배열 축소 방법에 대한 심층 분석(코드 포함)

奋力向前
奋力向前앞으로
2021-08-19 11:07:372549검색

이전 글 "Vue의 키 값이 전환 효과와 애니메이션 효과에 미치는 영향에 대한 간략한 논의(자세한 코드 설명)"에서 Vue의 키 값이 전환 효과에 어떤 영향을 미치는지에 대한 아이디어를 드렸습니다. 효과 및 애니메이션 효과. 다음 기사에서는 JS의 배열 축소 방법에 대한 이해를 제공합니다. 이는 필요한 참조 가치가 있습니다.

JS의 배열 축소 방법에 대한 심층 분석(코드 포함)

의미

reduce() 메서드는 누산기와 배열의 각 요소(왼쪽에서 오른쪽으로)에 함수를 적용하여 단일 값으로 줄입니다. reduce()方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。

语法

arr.reduce(callback[, initialValue])

参数

callback执行数组中每个值的函数,包含四个参数:accumulator累加器累加回调的返回值;它是上一次调用回调时返回的累积值,或initialValue(如下所示)。

currentValue

数组中正在处理的元素。currentIndex可选

数组中正在处理的当前元素的索引。 如果提供了initialValue,则索引号为 0,否则为索引为 1。array可选

调用reduce的数组initialValue可选

用作第一个调用callback的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用reduce将报错。Link to section返回值函数累计处理的结果

例子

求数组[1,2,3,4,5]里所有值的和

// 1 遍历求和
let count = 0;
let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
  count += arr[i];
}
console.log(count);
// output 15

// 2 eval
let count = eval([1, 2, 3, 4, 5].join("+"));
console.log(count);
// output 15

// 3 reduce
let count = [1, 2, 3, 4, 5].reduce((a, b) => a + b);
console.log(count);
// output 15

将二维数组转化为一维

var flattened = [
  [0, 1],
  [2, 3],
  [4, 5],
].reduce((acc, cur) => acc.concat(cur), []);

计算数组中每个元素出现的次数

var names = ["Alice", "Bob", "Tiff", "Bruce", "Alice"];

var countedNames = names.reduce(function (allNames, name) {
  if (name in allNames) {
    allNames[name]++;
  } else {
    allNames[name] = 1;
  }
  return allNames;
}, {});
// countedNames is:
// { &#39;Alice&#39;: 2, &#39;Bob&#39;: 1, &#39;Tiff&#39;: 1, &#39;Bruce&#39;: 1 }

使用扩展运算符和initialValueSyntax

// friends - an array of objects
// where object field "books" - list of favorite books
var friends = [
  {
    name: "Anna",
    books: ["Bible", "Harry Potter"],
    age: 21,
  },
  {
    name: "Bob",
    books: ["War and peace", "Romeo and Juliet"],
    age: 26,
  },
  {
    name: "Alice",
    books: ["The Lord of the Rings", "The Shining"],
    age: 18,
  },
];

// allbooks - list which will contain all friends&#39; books +
// additional list contained in initialValue
var allbooks = friends.reduce(
  function (prev, curr) {
    return [...prev, ...curr.books];
  },
  ["Alphabet"]
);

// allbooks = [
//   &#39;Alphabet&#39;, &#39;Bible&#39;, &#39;Harry Potter&#39;, &#39;War and peace&#39;,
//   &#39;Romeo and Juliet&#39;, &#39;The Lord of the Rings&#39;,
//   &#39;The Shining&#39;
// ]

Parameters

콜백4개의 매개변수가 포함된 배열의 각 값을 실행하는 함수: accumulator누산기 누적 콜백의 반환 값. 콜백이 마지막으로 호출되었을 때 반환된 누적 값 또는 initialValue(아래 참조)입니다.

currentValue

배열에서 처리 중인 요소입니다. currentIndex선택 사항

배열에서 처리 중인 현재 요소의 인덱스입니다. initialValue가 제공되면 색인 번호는 0이고, 그렇지 않으면 색인은 1입니다. 배열 선택 사항

reduce initialValue 선택 사항

에 대한 호출 배열은 콜백에 대한 첫 번째 호출의 첫 번째 매개변수 값으로 사용됩니다. . 초기값이 제공되지 않으면 배열의 첫 번째 요소가 사용됩니다. 초기값이 없는 빈 배열에 대해 reduce를 호출하면 오류가 보고됩니다. 섹션 링크🎜반환 값🎜함수 누적 처리 결과🎜🎜Example🎜🎜🎜배열 [1,2,3,4]에 있는 모든 값의 합을 구합니다. ,5] 🎜🎜
let arr = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
let result = arr.sort().reduce((init, current) => {
  if (init.length === 0 || init[init.length - 1] !== current) {
    init.push(current);
  }
  return init;
}, []);
console.log(result); //[1,2,3,4,5]
🎜🎜2차원 배열을 1차원으로 변환🎜🎜
let data = [1, 4, 2, 2, 4, 5, 6, 7, 8, 8, 9, 10];
//取最小值
let min = data.reduce((x, y) => (x > y ? y : x));
//取最大值
let max = data.reduce((x, y) => (x > y ? x : y));
🎜🎜배열의 각 요소가 나타나는 횟수를 계산합니다.🎜🎜
if (!Array.prototype.reduce) {
  Object.defineProperty(Array.prototype, "reduce", {
    value: function (callback /*, initialValue*/) {
      if (this === null) {
        throw new TypeError(
          "Array.prototype.reduce " + "called on null or undefined"
        );
      }
      if (typeof callback !== "function") {
        throw new TypeError(callback + " is not a function");
      }

      // 1. Let O be ? ToObject(this value).
      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;
      // >>表示是带符号的右移:按照二进制把数字右移指定数位,高位如符号位为正补零,符号位负补一,低位直接移除
      //  >>>表示无符号的右移:按照二进制把数字右移指定数位,高位直接补零,低位移除。

      // Steps 3, 4, 5, 6, 7
      var k = 0;
      var value;

      if (arguments.length >= 2) {
        value = arguments[1];
      } else {
        while (k < len && !(k in o)) {
          k++;
        }

        // 3. 长度为0 且初始值不存在 抛出异常
        if (k >= len) {
          throw new TypeError(
            "Reduce of empty array " + "with no initial value"
          );
        }
        value = o[k++];
      }

      // 8. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kPresent be ? HasProperty(O, Pk).
        // c. If kPresent is true, then
        //    i.  Let kValue be ? Get(O, Pk).
        //    ii. Let accumulator be ? Call(
        //          callbackfn, undefined,
        //          « accumulator, kValue, k, O »).
        if (k in o) {
          value = callback(value, o[k], k, o);
        }

        // d. Increase k by 1.
        k++;
      }

      // 9. Return accumulator.
      return value;
    },
  });
}
🎜🎜확산 연산자와 사용 array🎜🎜🎜rrreee🎜🎜Array deduplication🎜🎜rrreee🎜🎜최대값과 최소값을 취하는 배열🎜🎜rrreee🎜ES5 구현🎜rrreee🎜권장 학습: 🎜JavaScript 비디오 튜토리얼 🎜🎜

위 내용은 JS의 배열 축소 방법에 대한 심층 분석(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 chuchur.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제