js 过滤多维数组

假设你的初始数据如下

// 初始数据

wt_arr:[{
   qs_id: 3,
   answer_arr:[{
      answer_text: "是"
      is_normal: 1
   }]
},{
   qs_id: 4,
   answer_arr:[{
      answer_text: "文本"
      is_normal: 2
   }]
},{
   qs_id: 5,
   answer_arr:[{
      answer_text: "文本2"
      is_normal: 2
   }]
}]

要过滤掉“answer_arr”子数组中is_normal: 1的数据

// 过滤筛选出只包含异常的数据

var copy_wt_arr = JSON.parse(JSON.stringify(wt_arr))
new_arr = copy_wt_arr.map((item, index) => {
    item.answer_arr = item.answer_arr.filter(sub => sub.is_normal == 2)
    return item;
}).filter(item => item.answer_arr && item.answer_arr.length > 0);


// 注意,第二个filter不要省略,要两遍过滤,不然结果为
wt_arr:[{
   qs_id: 3,
   answer_arr:[]
},{
   qs_id: 4,
   answer_arr:[{
      answer_text: "文本"
      is_normal: 2
   }]
},{
   qs_id: 5,
   answer_arr:[{
      answer_text: "文本2"
      is_normal: 2
   }]
}]

输出结果:

### 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、付费专栏及课程。

余额充值