JavaScript实现数组降维详解

yizhihongxing

现在我会详细讲解一下“JavaScript实现数组降维详解”的完整攻略,过程中将包含两个示例。

什么是数组降维?

在 JavaScript 中,一个数组可能会包含多个层级,这时候我们可能需要将这个多维数组转换为一维数组,这个过程就被称为数组降维。

实现数组降维

在 JavaScript 语言中,我们可以使用一些方法来实现数组降维。

方法一:使用 flat() 方法

flat() 方法将多维数组转换为一维数组,它递归遍历每个数组元素,创建一个新的数组将它们组合在一起。语法如下:

arr.flat([depth]);

其中:

  • arr:必需。要降维的数组。
  • depth:可选。指定要递归的深度。默认值为 1

示例代码如下:

const nested_arr = [1, 2, [3, 4, [5, 6]]];
const flattened_arr = nested_arr.flat(2);
console.log(flattened_arr); // 输出 [1, 2, 3, 4, 5, 6]

上面的代码中,nested_arr 是一个有三个层级的数组,我们使用 flat() 方法将其降维,flattened_arr 变量内保存了降维后的一维数组。

方法二:使用递归函数

另外一种实现数组降维的方式是使用递归函数,对于一个多维数组,我们可以遍历其中的每个元素,判断其是否为数组,如果是数组则递归调用该函数,否则将该元素添加到结果数组中。示例代码如下:

function flatten(arr) {
  let res = [];
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      res = res.concat(flatten(arr[i]));
    } else {
      res.push(arr[i]);
    }
  }
  return res;
}

const nested_arr = [1, 2, [3, 4, [5, 6]]];
const flattened_arr = flatten(nested_arr);
console.log(flattened_arr); // 输出 [1, 2, 3, 4, 5, 6]

上面的代码中,flatten() 函数接收一个数组作为参数,返回一个降维后的一维数组。

示例

以下是在实际场景中应用数组降维的两个示例。

示例一:统计单词出现次数

在某些情况下,我们需要对一个由单词组成的多维数组进行处理,统计每个单词的出现次数。我们可以使用 flatMap() 方法对数组进行降维,然后使用 reduce() 方法进行计数。示例代码如下:

const words_arr = [['a', 'b'], ['b', 'c'], ['d'], ['c', 'd', 'e']];
const result = words_arr
  .flatMap(words => words)
  .reduce((acc, word) => {
    if (acc[word]) {
      acc[word]++;
    } else {
      acc[word] = 1;
    }
    return acc;
  }, {});
console.log(result); // 输出 {a: 1, b: 2, c: 2, d: 2, e: 1}

上面的代码中,words_arr 是一个由多个数组组成的多维数组,我们使用 flatMap() 方法将其降维成一个一维数组,然后使用 reduce() 方法对单词进行计数,最终得到一个对象,对象的属性是单词,属性值是单词在数组中出现的次数。

示例二:树形结构数据展开

在树形结构数据中,我们经常需要将树形结构转化为一维结构进行展示。我们通过递归函数将前端返回的数据中的子级的值添加到当前级中并减少维度,最后得到的便是一维的结构数据。

const tree = [
    {
        id: '1',
        text: 'node1'
        children: [
            {
                id: '11',
                text: 'node1-1',
                children: [
                    {
                        id: '111',
                        text: 'node1-1-1'
                    },
                    {
                        id: '112',
                        text: 'node1-1-2'
                    },
                ]
            },
            {
                id: '12',
                text: 'node1-2',
                children: [
                    {
                        id: '121',
                        text: 'node1-2-1'
                    },
                ]
            }
        ]
    },
    {
        id: '2',
        text: 'node2'
    }
];

function flattenTree(tree) {
    let res = [];
    for (let i = 0; i < tree.length; i++) {
        if (tree[i].children) {
            res = res.concat(flattenTree(tree[i].children));
            delete tree[i].children;
        }
        res.push(tree[i]);
    }
    return res;
}

const flattenTreeData = flattenTree(tree);
console.log(flattenTreeData);

上面的代码中,我们模拟了一棵树形结构的数据 tree,然后使用递归函数将其降维,最终输出了一维结构的数据 flattenTreeData

这里的实现的基本思路就是通过深度优先遍历,将子级结点的值添加到保存结果的数组中,并将其维度减少,最终达到了数组降维的目的。

总结

在本文中,我们介绍了 JavaScript 数组降维的两种实现方式:使用 flat() 方法和使用递归函数。并且给出了两个实际应用示例。通过学习本文,你将能够应对工作中的相关场景需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现数组降维详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 纯原生js实现table表格的增删

    下面是关于纯原生JS实现table表格的增删的攻略: 实现前必备知识 在开始实现表格的增删功能之前,有几点需要准备: HTML表格的结构 css样式控制 表格数据的动态绑定 监听HTML元素的事件 通过JS操作HTML元素 实现过程 首先创建一个空表格,代码如下: “`html Name Age Gender 操作 “` 接着,在JS代码里,声明一个对象…

    JavaScript 2023年6月10日
    00
  • vue-router后台鉴权流程实现

    下面我将为你详细讲解“vue-router后台鉴权流程实现”的完整攻略。 背景 Vue.js 是一款轻量级的前端框架,而 Vue Router 是 Vue.js 的官方路由库。在 Vue.js 应用开发中,Vue Router 经常被用于实现前端路由管理,来实现 SPA(单页应用)应用。但是,在实际开发中,我们常常需要做到前端用户权限管理,来保护我们的业务安…

    JavaScript 2023年6月11日
    00
  • Javascript Date getSeconds() 方法

    以下是关于JavaScript Date对象的getSeconds()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的getSeconds()方法 JavaScript Date对象的getSeconds()方法返回一个秒的数字(0-59)。方法可用获取当前日期的秒数。 下使用Date对象的getSeconds()方法的示例: var…

    JavaScript 2023年5月11日
    00
  • 深入理解vue3中的reactive()

    当谈到Vue的响应式系统时,有一个重要的函数:reactive()。在Vue3中,reactive()是我们创建响应式对象的首选方法。 1. reactive()函数的作用 reactive()函数可将一个普通JavaScript对象转换为响应式对象,从而使对象的属性变为可观察和自动更新的。这意味着,当响应式对象的某个属性发生变化时,Vue会自动使用新的值重…

    JavaScript 2023年6月10日
    00
  • js对字符的验证方法汇总

    针对“js对字符的验证方法汇总”的完整攻略,我给您详细的解答。 一、什么是字符验证? 在Web开发中,从用户处获得数据是非常重要的,但在接受数据时,需要对其进行验证,以保证数据的正确性和完整性。字符验证是保证输入正确性和完整性的方法之一,即在接受字符数据后,判断所输入的字符是否符合一定的验证规则。 二、字符验证的应用场景 字符验证通常用于以下场景: 用户名 …

    JavaScript 2023年5月28日
    00
  • JS实现获取剪贴板内容的方法

    获取剪贴板内容是Web开发中一个广泛的需求。使用JavaScript可以实现获取剪贴板的内容,下面是实现步骤的完整攻略。 1. 使用Clipboard API Javascript提供了navigator.clipboard全局对象,可以通过该对象实现对剪贴板的读取和写入操作。调用navigator.clipboard.readText()方法可以异步读取剪…

    JavaScript 2023年6月11日
    00
  • 寒冬求职之你必须要懂的Web安全

    寒冬求职之你必须要懂的Web安全 在进行Web开发工作时,我们必须要重视Web安全问题,因为没有安全保障的系统极易受到黑客攻击,泄露用户信息和系统的机密数据。在寒冬求职过程中,Web安全知识的掌握也是很重要的,今天我将为大家分享一下Web安全的攻略。 了解常见的攻击方式 SQL注入攻击 SQL注入攻击是指攻击者在Web应用程序使用的SQL语句中注入恶意的SQ…

    JavaScript 2023年6月11日
    00
  • Javascript基础教程之argument 详解

    Javascript基础教程之argument详解 在 JavaScript 中,函数的参数分为两种:形参和实参。形参是函数定义时声明的参数,实参是函数调用时传递给函数的参数。此外,JavaScript 还提供了另一种参数方式 —— argument 对象。argument 对象包含了函数调用时传递进来的所有实参,可以在函数内部直接使用。在本篇教程中,我们将…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部