如何根据列条件从二维数组中返回唯一元素?
问题与修复方案
我试过一个解决方案,但没能得到预期结果。
预期输出:
[ [4, "frente", 196], [5, "frente", 196] ]
我的当前代码:
function getUniqueData(arr = [ [4, "frente", 196], [4, "frente", 196], [5, "frente", 196] ], uniqueCols = [0]) { const uniqueData = arr.filter((currentRow, i) => { const currentCombo = uniqueCols.map(index => currentRow[index]); return !arr.some((row, j) => { const combo = uniqueCols.map(index => row[index]); return combo.every((c1, k) => c1 === currentCombo[k]) && i !== j; }); }); return uniqueData; } console.log(getUniqueData())
问题分析
当前代码的逻辑是:如果当前行在数组中存在其他索引不同但组合相同的行,就过滤掉当前行。这会导致所有重复出现的行都被过滤,最终只留下完全没有重复的行(比如示例里只会保留[5, "frente", 196]),不符合保留每个唯一组合一行的需求。
修复后的代码
改用Set记录已出现的组合,只保留每个组合的第一次出现:
function getUniqueData(arr = [ [4, "frente", 196], [4, "frente", 196], [5, "frente", 196] ], uniqueCols = [0]) { const seen = new Set(); return arr.filter(row => { // 把指定列的值拼接成唯一键,避免引用类型无法直接比较 const key = uniqueCols.map(index => row[index]).join('|'); if (!seen.has(key)) { seen.add(key); return true; } return false; }); } console.log(getUniqueData())
这段代码会遍历数组,每遇到一个未记录过的组合就加入Set并保留该行,重复的组合直接过滤,最终得到想要的去重结果。
内容的提问来源于stack exchange,提问作者onit
相关产品推荐
相关产品推荐

