对多维数组根据递归进行过滤

这段文章介绍了如何使用JavaScript编写一个递归函数,过滤一个多维数组(设备和设备分组)中的controlMode为0的设备,确保返回的列表只包含controlMode不为0的设备和设备分组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对多维数组根据递归进行过滤

deviceOrGroupList = [

device1,

device2,

[ device3,device4],

device5

]

遍历一个区域下的设备和设备分组的列表,命名为deviceOrGroupList。需要过滤掉controlMode = 0 的设备。

如果是设备,则过滤掉,

如果是分组,则遍历分组下的设备,过滤掉ControlMode = 0 的设备。

返回的deviceOrGroupList 里的设备都是controlMode!=0,分组也不含controlMode = 0 的设备。

以下是使用JavaScript实现的代码,根据你的要求过滤设备和设备分组的控制模式为0的情况:

function filterDevicesAndGroups(deviceOrGroupList) {
  let filteredList = [];

  for (let item of deviceOrGroupList) {
    if (item instanceof Device) {
      let device = item;
      if (device.controlMode !== 0) {
        filteredList.push(device);
      }
    } else if (item instanceof DeviceGroup) {
      let group = item;
      let filteredDevices = filterDevicesAndGroups(group.devices);
      if (filteredDevices.length > 0) {
        group.devices = filteredDevices;
        filteredList.push(group);
      }
    }
  }

  return filteredList;
}

// 假设存在一个名为region的区域对象,其中包含设备和设备分组的列表
let deviceOrGroupList = region.deviceOrGroupList;

// 调用函数进行过滤和遍历
let filteredList = filterDevicesAndGroups(deviceOrGroupList);

// 输出过滤后的设备和设备分组列表
console.log(filteredList);

在这段代码中,我们定义了一个名为filterDevicesAndGroups的递归函数,它接受一个deviceOrGroupList参数,这个参数是设备和设备分组的列表。

在函数中,我们使用for...of循环遍历列表中的每个元素。对于设备类型的元素,我们检查其controlMode属性是否不等于0,如果是则将其添加到filteredList中。

对于设备分组类型的元素,我们递归调用filterDevicesAndGroups函数来过滤分组下的设备,并将过滤后的设备列表赋值给分组的devices属性。如果过滤后的设备列表长度大于0,则将该分组添加到filteredList中。

最后,我们返回过滤后的设备和设备分组列表filteredList

### JavaScript 多维数组去重的方法 在 JavaScript 中对多维数组进行去重是一个常见的需求。以下是一些实现多维数组去重的解决方案。 #### 方法一:递归与 `Set` 结合 可以使用递归的方式遍历多维数组,并结合 `Set` 来确保每个元素只出现一次。此方法适用于嵌套层级不确定的情况。 ```javascript function deepUniq(arr) { const seen = new Set(); function helper(item) { if (Array.isArray(item)) { return item.map(helper).filter((el) => { const key = JSON.stringify(el); if (seen.has(key)) return false; seen.add(key); return true; }); } return item; } return helper(arr); } const arr = [[1, 2], [3, 4], [1, 2], [5, 6]]; console.log(deepUniq(arr)); // 输出: [[1, 2], [3, 4], [5, 6]] ``` 这种方法利用了 `Set` 的唯一性特性,同时通过递归处理多维数组[^1]。 #### 方法二:基于 `reduce` 和 `JSON.stringify` 对于二维数组(或固定嵌套深度的多维数组),可以使用 `reduce` 方法来构建一个新数组,并通过 `JSON.stringify` 将子数组转换为字符串形式以检测重复项。 ```javascript function uniq2DArray(arr) { return arr.reduce((acc, curr) => { const str = JSON.stringify(curr); if (!acc.some(el => JSON.stringify(el) === str)) { acc.push(curr); } return acc; }, []); } const arr2D = [[1, 2], [3, 4], [1, 2], [5, 6]]; console.log(uniq2DArray(arr2D)); // 输出: [[1, 2], [3, 4], [5, 6]] ``` 该方法的时间复杂度较高,但由于使用了 `JSON.stringify`,它能够有效处理嵌套数组的比较问题[^2]。 #### 方法三:双重循环过滤 如果需要保留原始顺序并且不依赖现代方法(如 `Set` 或 `reduce`),可以使用双重循环逐一比较并过滤重复项。 ```javascript function uniqueByLoop(arr) { const result = []; for (let i = 0; i < arr.length; i++) { let isDuplicate = false; for (let j = 0; j < result.length; j++) { if (JSON.stringify(arr[i]) === JSON.stringify(result[j])) { isDuplicate = true; break; } } if (!isDuplicate) result.push(arr[i]); } return result; } const arrNested = [[1, 2], [3, 4], [1, 2], [5, 6]]; console.log(uniqueByLoop(arrNested)); // 输出: [[1, 2], [3, 4], [5, 6]] ``` 这种方法虽然简单,但时间复杂度较高,适合小规模数据集[^3]。 ### 注意事项 - 对于深层嵌套的数组,推荐使用递归方法。 - 使用 `JSON.stringify` 时需注意其可能无法正确区分某些复杂对象(如包含函数或 `undefined` 的对象)。 - 如果性能是关键因素,应避免频繁调用 `JSON.stringify`,可考虑其他优化策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凭栏听雨客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值