数组扁平化

Myth丶恋晨 2023-10-06 16:03 80阅读 0赞

概念:用于将嵌套多层的数组“拉平”,变成一维的数组

方法一:通过concat将二维数组转化为一维数组

原理:通过将扩展运算符,将数组内部展开,并通过concat连接两个字符串的方式返回一个新的数组

  1. let a = [12, 3, 45, [6, 7, 8]]
  2. console.log(a) // [12, 3, 45, Array(3)]
  3. console.log([].concat(...a)) // [12, 3, 45, 6, 7, 8]

60bba63be38d101d342914185bba0b78.png

方法二:使用数组方法join和字符串方法split进行数组扁平化

原理:通过join方法将数组转化为以点隔开的字符串,在使用split把转化的字符串转化成字符串数组,通过。map方法将内部字符串转化数字类型的

  1. let a = [4, 1, 2, 3, 6, [7, 8, [3, 9, 10, [4, 6, 11]]]];
  2. let b = a.join(',').split(',').map(Number)
  3. console.log(b) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, 4, 6, 11]

7fb9bbe1e451c5d30554fdf919883bbc.png

方法三:通过正则方法和JSON.stringify方法和数组方法

原理:首先将数组转化为字符串 使用字符串匹配正则规则 替换所有的 ‘[‘ ‘]‘ 和方法二类似 split 主要是讲字符串转化为数组,map将字符串数组转化为数字

  1. let a = [4, 1, 2, 3, 6, [7, 8, [3, 9, 10, [4, 6, 11]]]];
  2. let c = JSON.stringify(a).replace(/\[|\]/g, '').split(',').map(Number);
  3. console.log(c) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, 4, 6, 11]

f46aa463493629b4542564685ebef573.png

方法四:函数递归

原理:判断获取的当前值是不是数组,是数组就递归调用

  1. let d = [];
  2. let fn = arr => {
  3. for (let i = 0; i < arr.length; i++) {
  4. if (Array.isArray(arr[i])) {
  5. fn(arr[i]);
  6. } else {
  7. d.push(arr[i]);
  8. }
  9. }
  10. }
  11. fn(a)
  12. console.log(d) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, 4, 6, 11]

ca9220279f1b583605ca96fa336d2722.png

方法五:通过reduce方法进行数组扁平化

原理:主要是通过reduce的依次执行,判断当前拿到的对象是不是数组, 是数组就进行一次函数递归将内部所有数组扁平化(与方法四类似)

  1. let a = [4, 1, 2, 3, 6, [7, 8, [3, 9, 10, [4, 6, 11]]]];
  2. function flatten(arr) {
  3. return arr.reduce((result, item) => {
  4. console.log(result, item); // 查看结果你会发现,把每个数组进行拆分并取出
  5. return result.concat(Array.isArray(item) ? flatten(item) : item);
  6. }, []);
  7. };
  8. console.log(flatten(a)) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, 4, 6, 11]

3a598f883ced674e474d1dee488591ee.png

方法六:ES6新增方法flat()

  1. let a = [4, 1, 2, 3, 6, [7, 8, [3, 9, 10, [4, 6, 11]]]];
  2. let e = a.flat() // 不传参的时候 表示将二维数组转一维数组
  3. console.log(e) // [4, 1, 2, 3, 6, 7, 8, Array(4)]
  4. let f = a.flat(2) // 传入2 表示将两层嵌套数组 转化为一维数组
  5. console.log(f) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, Array(3)]
  6. let g = a.flat(Infinity) // Infinity 使用这个关键字可以将所包含的所谓数组转化为一维数组
  7. console.log(g) // [4, 1, 2, 3, 6, 7, 8, 3, 9, 10, 4, 6, 11]

3984cdf54c245a4241efa72a0b4a47af.png

数组去重

概念:去除数组中重复重新的值

方法一:循环遍历截取

原理:通过每次循环遍历比较当前值在不在数组中,在就删除当前值并且索引减一,弊端,会改变原数组

  1. let arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
  2. function removeDuplicatedItem(arr) {
  3. for (var i = 0; i < arr.length - 1; i++) {
  4. for (var j = i + 1; j < arr.length; j++) {
  5. if (arr[i] === arr[j]) {
  6. arr.splice(j, 1);//console.log(arr[j]);
  7. j--;
  8. }
  9. }
  10. }
  11. return arr;
  12. }
  13. let arr2 = removeDuplicatedItem(arr);
  14. console.log(arr); // [1, 23, 3, 5, 6, 7, 9, 8]
  15. console.log(arr2); // [1, 23, 3, 5, 6, 7, 9, 8]

3f26a9d5b9b447f1727497ab160fa9b4.png

方法二:借助indexOf()方法

原理:判断此元素在该数组中首次出现的位置下标与循环的下标是否相等 与方法一类似

  1. let arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
  2. function rep2(arr) {
  3. for (var i = 0; i < arr.length; i++) {
  4. // console.log(arr.indexOf(arr[i])); 可以输出当前元素首次出现的索引
  5. if (arr.indexOf(arr[i]) !== i) {
  6. arr.splice(i, 1);//删除数组元素后数组长度减1后面的元素前移
  7. i--;//数组下标回退
  8. }
  9. }
  10. return arr;
  11. }
  12. let arr2 = rep2(arr);
  13. console.log(arr); // [1, 23, 3, 5, 6, 7, 9, 8]
  14. console.log(arr2); // [1, 23, 3, 5, 6, 7, 9, 8]

dfb8e26950981b64995379dfb2d6472e.png

方法三:借助新数组和indexOf()方法

原理:通过indexOf方判断当前元素在数组中的索引如果与循环的下标相等则添加到新数组中 原数组不变

  1. let arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
  2. function rep(arr) {
  3. let ret = [];
  4. for (var i = 0; i < arr.length; i++) {
  5. if (arr.indexOf(arr[i]) == i) {
  6. ret.push(arr[i]);
  7. }
  8. }
  9. return ret;
  10. }
  11. let arr2 = rep(arr);
  12. console.log(arr); // [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5]
  13. console.log(arr2); // [1, 23, 3, 5, 6, 7, 9, 8]

fddfce67193c75405c9902f3cfa86e1d.png

方法四:借助空对象

原理:通过对象来记录新数组中已存储过的元素 不改变原数组 与方法三类似

  1. let arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
  2. let o = {};
  3. let arr2 = [];
  4. for (var i = 0; i < arr.length; i++) {
  5. var k = arr[i];
  6. if (!o[k]) {
  7. o[k] = true;
  8. arr2.push(k);
  9. }
  10. }
  11. console.log(arr); // [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5]
  12. console.log(arr2); // [1, 23, 3, 5, 6, 7, 9, 8]

d53c6a0ddd22074d3031c8dd4b552185.png

方法五:filter方法

原理:查找当前元素索引出现的位置是否与当前元素索引值相等,是表示true返回 ,如果当前元素索引不等与当前索引,说明已经出现过,出现过就不返回。 原数组不变

  1. let arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
  2. let arr2 = arr.filter(function (element, index, array) {
  3. return array.indexOf(element) === index;
  4. });
  5. console.log(arr); // [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5]
  6. console.log(arr2); // [1, 23, 3, 5, 6, 7, 9, 8]

505d376d80401cd84429378d23d4f8b5.png

方法六:使用include方法

原理:与indexOf类似,判断当前元素是否存在,不存在就添加 不改变原数组

  1. let arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
  2. function rep() {
  3. let res = [];
  4. for (let i = 0; i < arr.length; i++) {
  5. if (!res.includes(arr[i])) res.push(arr[i]);
  6. }
  7. return res;
  8. }
  9. console.log(arr); // [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5]
  10. console.log(rep()); // [1, 23, 3, 5, 6, 7, 9, 8]

337a3cebeb8bec14853f33e13f24807a.png

方法七:es6 新增数据结构 new Set()方法

原理:new Set() 的成员具有唯一性,不能重复

  1. let arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
  2. let arr2 = new Set(arr)
  3. console.log(arr); // [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5]
  4. console.log(arr2) // {1, 23, 3, 5, 6, …}
  5. console.log(rep()); // [1, 23, 3, 5, 6, 7, 9, 8]

3785887357ec2fe19dc333f1fd071f2a.png

做一个合格的代码搬运工,遇事不决先百度 ,百度测试,测试再百度。

19440d65f1f26c398890ec161b196b60.png

发表评论

表情:
评论列表 (有 0 条评论,80人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数组扁平

    概念:用于将嵌套多层的数组“拉平”,变成一维的数组 方法一:通过concat将二维数组转化为一维数组 原理:通过将扩展运算符,将数组内部展开,并通过concat连接两个

    相关 JS数组扁平

    一道笔试题,将一个嵌套数组扁平化处理。   ▍题目 > 将\[1,2,\[3,\[4,5\]\]\]转化成\[1,2,3,4,5\]。   ▍方法一:递归

    相关 js 数组扁平

    第一种 > 依次把每一项添加进新数组 > 如果为非数组,直接添加 > 如果为数组,则添加递归操作的结果 function flatten(ar