mysql 扁平结构设计_数组扁平化

2023-10-26

[TOC]

# 简介

数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组。

举个例子,假设有个名为 flatten 的函数可以做到数组扁平化,效果就会如下:

~~~js

var arr = [1, [2, [3, 4]]];

console.log(flatten(arr)) // [1, 2, 3, 4]

~~~

# flat

ES6 为数组实例新增了`flat`方法,用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数组没有影响。

`flat`默认只会 “拉平” 一层,如果想要 “拉平” 多层的嵌套数组,需要给`flat`传递一个整数,表示想要拉平的层数。

~~~

function flattenDeep(arr, deepLength){

return arr.flat(deelLength)

}

~~~

# 递归

~~~

function flatten1(arr) {

var result = []

for (var i = 0; i < arr.length; i++) {

if (Array.isArray(arr[i])) {

result.push.apply(result, flatten1(arr[i]))

// 也可以使用 concat,但会产生新数组

// result = result.concat(flatten1(arr[i]))

} else {

result.push(arr[i])

}

}

return result

}

~~~

# toString

如果数组的元素都是数字,那么我们可以考虑使用 toString 方法,因为:

~~~js

[1, [2, [3, 4]]].toString() // "1,2,3,4"

~~~

调用 toString 方法,返回了一个逗号分隔的扁平的字符串,这时候再 split,然后转成数字就可以实现扁平化。

然而这种方法使用的场景却非常有限,**如果数组是 [1, '1', 2, '2'] 的话,这种方法就会产生错误的结果**。

~~~

function flatten2(arr) {

return arr.toString().split(',').map(function (item) {

return +item

})

}

~~~

# recude

~~~

function flatten3(arr) {

return arr.reduce(function (prev, next) {

// 可以简写成

// return prev.concat(Array.isArray(next) ? flatten3(next) : next)

if (Array.isArray(next)) {

return prev.concat(flatten3(next))

} else {

return prev.concat(next)

}

}, [])

}

~~~

# ...

ES6 增加了扩展运算符,用于取出参数对象的所有可遍历属性,拷贝到当前对象之中:

~~~js

var arr = [1, [2, [3, 4]]];

console.log([].concat(...arr)); // [1, 2, [3, 4]]

~~~

我们用这种方法只可以扁平一层,但是顺着这个方法一直思考,我们可以写出这样的方法:

~~~

function flatten4 (arr) {

while(arr.some((item) => Array.isArray(item))) {

arr = [].concat(...arr)

}

return arr

}

~~~

# 参考资料

[JavaScript专题之数组扁平化](https://github.com/mqyqingfeng/Blog/issues/36#)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql 扁平结构设计_数组扁平化 的相关文章

随机推荐

  • JAVA和C++的几个主要不同点

    1 指针 JAVA语言让编程者无法找到指针来直接访问内存无指针 并且增添了自动的内存治理功能 从而有效地防止了c c 语言中指针操作失误 如野指针所造成的系统崩溃 但也不是说JAVA没有指针 虚拟机内部还是使用了指针 只是外人不得使用而已
  • 100天精通Python(数据分析篇)——第69天:Pandas常用数据筛选方法(between、isin、loc、iloc)

    文章目录 一 布尔索引 二 between 三 isin 1 单列筛选 2 多列筛选 3 通过字典的形式传递多个条件 4 删除异常值所在行 5 isnotin实现 四 loc iloc 重要 0 创建DataFrame 1 提取行数据 2
  • Jmeter(八) - 从入门到精通 - JMeter配置元件(详解教程)

    1 简介 JMeter配置元件可以用来初始化默认值和变量 读取文件数据 设置公共请求参数 赋予变量值等 以便后续采样器使用 将在其作用域的初始化阶段处理 配置元件 Config Element 提供对静态数据配置的支持 可以为取样器设置默认
  • Flutter之基本路由,命名路由跳转,返回上一页,替换路由和返回根路由——Flutter基础系列

    需求 今天为大家介绍一下Flutter是如何进行页面跳转 路由管理的 一 基本路由 1 基本路由使用 假设我们需要从A页面跳转到basic页面 则我们需要在A页面引入 import basic dart 然后在A页面通过以下方法跳转 Rai
  • C/C++指向二维数组的指针

    1 二维数组 设有整型二维数组a 3 4 如下 0 1 2 3 4 5 6 7 8 9 10 11 它的定义为 int a 3 4 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000 各下标变量的首地址及其值如图
  • Spring 全家通之 SpringMVC 如何传递参数以及返回值的类型

    大家好 我是你们的老朋友 Java 学术趴 最近小编又在整了 Spring 全家桶笔记 笔记会每天定时的进行发放 喜欢的大佬们欢迎收藏点赞关注呦 小编会每天分享的呦 今天给大家带来新的框架技术 SpringMVC Spring MVC 属于
  • 带你全面了解自动化测试框架—从理论到工具

    软件行业正迈向自主 快速 高效的未来 为了跟上这个高速前进的生态系统的步伐 必须加快应用程序的交付时间 但不能以牺牲质量为代价 快速实现质量是必要的 因此质量保证得到了很多关注 为了满足卓越的质量和更快的上市时间的需求 自动化测试将被优先考
  • 这张磁盘有写保护_win10 移动硬盘或U盘清除“被写保护”

    Win10系统取消移动硬盘写保护的方法 呃 这是别人写得不错的文章 我转载一下 发布时间 2016 12 20 发布者 win7之家 慧歌 浏览数 1089 移动硬盘是我们经常会用到的一个存储设备 在使用过程中难免会碰到一些情况 就有用户升
  • 【置顶】Flutter系列、Python系列目录

    Flutter系列 Flutter 1 1 8个Flutter的优势以及为什么要在下一个项目中尝试Flutter Flutter安装与运行 Flutter1 2 在 Windows 10下配置Flutter开发环境 Flutter1 3 在
  • 读书笔记 摘自:《分享经济的爆发》

    读书笔记 摘自 分享经济的爆发 作者 印 阿鲁 萨丹拉彻 赞 誉 创新的实验性与监管的连续性本身存在矛盾 监管者通常需要通过更新现有法律体系使其与创新性服务相适应 否则就会阻碍创新 将分享经济看作市场经济和礼物经济的 过渡态 资本主义和社会
  • 20171010离线赛总结

    题解 第一题 字符连通块 这道题还是比较好想的 首先把每个连通块标记出来 并用第一次扫到的点标记为这个连通块的父节点 接下来要做的就是把一个 周围的连通块连通起来 不过要注意一点 在连通标记的时候不要用memset memset的复杂度是m
  • Windows端CUDA11.3+CUDNN+pytorch环境搭建

    1 显卡驱动的安装 最近 在学习pytorch深度学习 遇到很多的坑 环境配置也出现过问题 忍不住和大家进行分享 现在把环境搭建过程分享给大家 1 1 查看自己的显卡 具体操作 我的电脑 属性 设备管理器 显示适配器 1 2 驱动的下载 安
  • (c语言实现)算法笔记之bfs及pta习题

    目录 一 bfs 广度优先搜索 的定义 二 bfs 广度优先搜索 的应用 三 题型训练 1 奇怪的电梯 2 寻宝 3 龙舌兰酒吧 四 总结 一 bfs 广度优先搜索 的定义 BFS 全称是 Breadth First Search 中文名是
  • 基于XMPP协议的Android即时通信系

    以前做过一个基于XMPP协议的聊天社交软件 总结了一下 发出来 设计基于开源的XMPP即时通信协议 采用C S体系结构 通过GPRS无线网络用TCP协议连接到服务器 以架设开源的Openfn e服务器作为即时通讯平台 系统主要由以下部分组成
  • react-router 里的 Link 标签和 a 标签有什么区别?

    相同点 从最终渲染的 DOM 来看 这两者都是链接 都是 a 标签 区别 是 react router 里实现路由跳转的链接 一般配合 a
  • 【代码记录】pytorch推理及与onnx推理精度对比

    1 pytorch推理 import cv2 import sys import numpy as np import torch os from torch import nn import torchvision models as m
  • 子串/子段问题总结

    1 一般子串问题 求一个串中满足某种条件的子串 1 如果所求子串的条件是一个值 比如sum 则考虑子段问题 注意这样一个性质 子段 前缀差 子段和 前缀和的差 vector
  • 4.3 链码的其它操作:实现对链码的打包升级

    目标 实现如何对链码打包签名 链码升级的实现 任务实现 链码部署除了正常的安装 实例化操作步骤之外 还有一种部署方式 即先将链码进行打包 然后对已打包的文件进行签名 最后再进行安装与实例的操作 4 3 1 链码打包及签名 4 3 1 1 打
  • final-期末大作业-制作AR射箭小游戏(Unity AR配置详细教程)

    要求 大作业要求 制作一款特定技术应用小游戏 并提交技术报告 内容 请参考以下技术主题 但不限于这些主题 运用手机拍若干全景图 贴到天空盒或球型天空 做一个简单校园漫游功能 粒子系统效果制作 必须带一个控制组件 控制粒子呈现效果 UI系统制
  • mysql 扁平结构设计_数组扁平化

    TOC 简介 数组的扁平化 就是将一个嵌套多层的数组 array 嵌套可以是任何层数 转换为只有一层的数组 举个例子 假设有个名为 flatten 的函数可以做到数组扁平化 效果就会如下 js var arr 1 2 3 4 console