Javascript 筛选数组中的重复项

Javascript 筛选数组中的重复项,javascript,arrays,Javascript,Arrays,我得到了一个数组,如下所示: [ [ 48, 28 ], [ 36, 19 ], [ 54, 12 ], [ 24, 12 ], [ 30, 12 ], [ 42, 12 ], [ 40, 10 ], [ 48, 4 ], [ 12, 4 ], [ 18, 3 ], [ 20, 2 ], [ 36, 1 ] ] 我想根据每个项目的第一个值筛选重复项:项目[0]。例如,对于上面的数组,我想从中删除[48,4]和[36,1],因为它已经包括[48,28]和[36,19]

我得到了一个数组,如下所示:

[
  [ 48, 28 ], [ 36, 19 ],
  [ 54, 12 ], [ 24, 12 ],
  [ 30, 12 ], [ 42, 12 ],
  [ 40, 10 ], [ 48, 4 ],
  [ 12, 4 ],  [ 18, 3 ],
  [ 20, 2 ],  [ 36, 1 ]
]

我想根据每个项目的第一个值筛选重复项:
项目[0]
。例如,对于上面的数组,我想从中删除
[48,4]
[36,1]
,因为它已经包括
[48,28]
[36,19]
。提前感谢您的帮助。

据我所知,没有JS方法可以显式执行此操作,但这并不意味着您不能编写自己的

显而易见的解决方案是创建一个字典,其中键是第0个索引中的数字,值是第1个索引中的数字

如果他们的密钥已经存在,这将是一个副本,您可以删除该条目


这不是一个最佳解决方案,但会起作用。

与在数组中获取唯一值相比,这样做的唯一挑战通常是只使用数组的一部分(第一个数字)。您只需在
筛选时跟踪它们,例如在
集合中

const seen = new Set();
const filtered = original.filter(entry => {
    // Get the key for this entry
    const key = entry[0]
    // New one?
    const flag = !seen.has(key);
    if (flag) {
        // Yes, add it
        seen.add(key);
    }
    // Return the flag
    return flag;
});
实例:

const-original=[
[ 48, 28 ], [ 36, 19 ],
[ 54, 12 ], [ 24, 12 ],
[ 30, 12 ], [ 42, 12 ],
[ 40, 10 ], [ 48, 4 ],
[ 12, 4 ],  [ 18, 3 ],
[ 20, 2 ],  [ 36, 1 ]
];
const seen=新集合();
const filtered=original.filter(条目=>{
//获取此条目的密钥
常量键=条目[0]
//新的?
常量标志=!seen.has(键);
国际单项体育联合会(旗){
//是的,加上它
参见。添加(键);
}
//还旗
返回标志;
});

console.log(过滤)使用迭代
数据
,同时将第一个数字的a作为
,项作为
。在每次迭代中,如果映射没有第一个数字作为键,则添加记录。最后,此映射的
值将成为您的预期结果:

const数据=[
[ 48, 28 ], [ 36, 19 ],
[ 54, 12 ], [ 24, 12 ],
[ 30, 12 ], [ 42, 12 ],
[ 40, 10 ], [ 48, 4 ],
[ 12, 4 ],  [ 18, 3 ],
[ 20, 2 ],  [ 36, 1 ]
];
const res=[…data.reduce((acc,arr)=>{
常数[第一]=arr;
如果(第一个&!acc.has(第一个))acc.set(第一个,arr);
返回acc;
},新映射)。值();

控制台日志(res)您可以缓存第一次出现的内容,然后根据键的值进行过滤

const数据=[
[ 48, 28 ] , [ 36, 19 ],
[ 54, 12 ] , [ 24, 12 ],
[ 30, 12 ] , [ 42, 12 ],
[ 40, 10 ] , [ 48,  4 ],
[ 12,  4 ] , [ 18,  3 ],
[ 20,  2 ] , [ 36,  1 ]
];
const initial=data.reduce((acc[key,value])=>
({…acc[key]:acc[key]??value}),{});
const filtered=data.filter(([key,value])=>initial[key]==value);
log(filtered.map(JSON.stringify.join)('\n'))

.as console wrapper{top:0;max height:100%!important;}
您可以通过查找嵌套数组的第一项来对数组进行闭包和筛选

const
数据=[[48,28]、[36,19]、[54,12]、[24,12]、[30,12]、[42,12]、[40,10]、[48,4]、[12,4]、[18,3]、[20,2]、[36,1],
结果=data.filter((s=>([v])=>!s.has(v)和&s.add(v))(新集合));
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
以前的解决方案运行良好,但这也可以通过附加数组和使用三元运算符来实现:

let previousElements = []
    myArray.forEach((element, index) => {
    (!previousElements.includes(element[0])) ? previousElements.push(element[0]) :  myArray.splice(index, 1)
});
也就是说:

myArray.forEach((element, index) => {
//If we haven't crossed the element yet, add it to the previous elements array
if(!previousElements.includes(element[0])){
    previousElements.push(element[0])
}

//If it has been seen, remove it
else{
    myArray.splice(index, 1)
}});

也许我的解决方案更容易理解

让arr=[
[ 48, 28 ], [ 36, 19 ],
[ 54, 12 ], [ 24, 12 ],
[ 30, 12 ], [ 42, 12 ],
[ 40, 10 ], [ 48, 4 ],
[ 12, 4 ],  [ 18, 3 ],
[ 20, 2 ],  [ 36, 1 ]
]
常量simpler=[];
常数indexofuniqueel=[];
//检测异常元素索引并将其推入arr
for(设i=0;iconsole.log(arr)
(最初错误地阅读了问题。如果您看到上面的
.join(“,”
),请点击刷新。)发现这个问题有点神秘。。。我来挖。谢谢。后面没有隐藏功能。它为
s
获取一个集合,并为
过滤器
返回一个函数。在内部,它检查该值并添加该值(如果不存在)。投票支持不在此处发布代码。这个问题就像“这是我的代码,让它发挥作用”,你的回答鼓励他/她根据提示而不是代码实现自己的解决方案。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-@MartinSeeler这不是什么严肃的事情,只是我试图在Codewars上解决的问题的最后一步。我没能把我的头绕到最后一步,很好奇其他人怎么能解决这个问题,所以我只是问这里…@chalatum我明白了,希望你现在明白了。>我很好奇其他人怎么能解决这个问题,这就是为什么存在的原因。将您的解决方案张贴在那里,并征求反馈意见