扁平化数组的方式 JS

博客围绕实际开发中扁平化数组的需求展开,介绍了将数组进行两种格式转换的实现方法,包括前者转后者和后者转前者,并对后者转前者的方法原理进行说明,指出最终会形成树状结构。

  在实际开发中,有很多扁平化数组的需求,比如将数组let a = [{id:1,name:'小明', children:[{id:2,name:'小小'}]}]转换为[{{id:1, name:'小明',parentId:undefined}, {id:2, name:'小小', parentId:1}],或者将上述后者数据格式转换为前者,其实实现代码很简单。

代码如下:
前者转后者:
    let test1 = [
      {
        id: 1,
        name: '小明',
        children: [
          {
            id: 12,
            name: '小张',
            children: [
              {
                id: 123,
                name: '小黄'
              }
            ]
          },
          {
            id: 23,
            name: '小霄'
          }
        ]
      }
    ];
    treeToArray(test1);
    // 输出如下对象:
    // 0: {id: 1, name: "小明", parentId: undefined}
	// 1: {id: 12, name: "小张", parentId: 1}
	// 2: {id: 123, name: "小黄", parentId: 12}
	// 3: {id: 23, name: "小霄", parentId: 1}
    function treeToArray(data) {
      return data.reduce(function onReduce(init, cur) {
        init.push({
          id: cur.id,
          name: cur.name,
          parentId: cur.parentId
        });
        cur.children &&
          cur.children.forEach(v => {
            v.parentId = cur.id;
            // 如果使用Vue等框架,建议如此使用递归,否则此处可替换为arguments.callee(init, v)
            onReduce(init, v);
          });
        return init;
      }, []);
    }
后者转前者:
    let test2 = [
      { id: 1, name: '小明', parentId: undefined },
      { id: 12, name: '小张', parentId: 1 },
      { id: 123, name: 'abc', parentId: 12 },
      { id: 23, name: 'qqq', parentId: 1 },
      { id: 888, name: '小羊', parentId: undefined },
      { id: 555, name: '小小', parentId: 123 }
    ];
    arrayToTree(test2); // 可自行打印结果
    function arrayToTree(data) {
      return data.reduce(function (init, cur, _, arr) {
        cur.children = arr.filter(v => v.parentId === cur.id);
        !cur.parentId && init.push(cur);
        return init;
      }, []);
    }

说明一下后者转前者的方法,因为每次init.push(cur)只是塞进了当前对象的地址,而后续循环会添加每个对象的children属性,并不会影响对象的地址,因此最终形成一个树状结构。

JavaScript 中,可以使用多种方法将嵌套数组转换为扁平化的单层数组。以下是几种常见的实现方式: ### 使用 `Array.prototype.flat()` 这是最直接的方式之一,`flat()` 方法会按照指定深度递归地将所有子数组元素提取出来形成新的数组。 ```javascript const arr = [1, [2, [3, [4]]]]; const flatArr = arr.flat(Infinity); // 指定 Infinity 来完全展开任意层级的数组 console.log(flatArr); // 输出: [1, 2, 3, 4] ``` ### 自己编写递归函数 如果需要兼容性更好、或希望对复杂情况有更多的控制权,也可以通过自定义递归来解决问题: ```javascript function flatten(arr) { let result = []; for (let i of arr) { if (Array.isArray(i)) { result.push(...flatten(i)); // 如果当前项是数组,则继续递归处理 } else { result.push(i); } } return result; } const arr = [1, [2, [3, [4]]]]; console.log(flatten(arr)); // 输出: [1, 2, 3, 4] ``` 上述示例中我们遍历了每一个元素,并检查它是否为数组。如果是的话就进一步对其进行“展平”操作;如果不是则简单加入结果集当中。 另外还有一种更简洁的办法就是利用 reduce 和 concat 的组合形式来做这件事儿: ```javascript const flatten = arr => arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []); const arr = [1, [2, [3, [4]]]]; console.log(flatten(arr)); // 输出: [1, 2, 3, 4] ``` 以上三种方法都可以很好地解决数组深层次嵌套的问题。选择合适的方式来满足实际需求即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值