Javascript 如何在数组中选择唯一的元素?

Javascript 如何在数组中选择唯一的元素?,javascript,arrays,sorting,unique,element,Javascript,Arrays,Sorting,Unique,Element,我试图解决在数组中查找唯一元素的任务。 到目前为止,我设法解决了95%的问题,但我在0上失败了。我得到一个错误,表示预期为0,但得到1 我应该得到//10,确实如此,但在我在线考试失败之后。对于所有其他值,它已传递 关于如何解决这个问题以及我在这里遗漏了什么,有什么想法吗 函数findOne(arr){ 设x=arr[0]; 对于(让我考虑arr){ 如果(i==x){ 继续; }否则{ x=i; } 返回x; } } log(findOne([3,10,3,3,3])我不太懂你的代码。从数组

我试图解决在数组中查找唯一元素的任务。 到目前为止,我设法解决了95%的问题,但我在0上失败了。我得到一个错误,表示预期为0,但得到1

我应该得到//10,确实如此,但在我在线考试失败之后。对于所有其他值,它已传递

关于如何解决这个问题以及我在这里遗漏了什么,有什么想法吗

函数findOne(arr){
设x=arr[0];
对于(让我考虑arr){
如果(i==x){
继续;
}否则{
x=i;
}
返回x;
}
}

log(findOne([3,10,3,3,3])我不太懂你的代码。从数组中的第一个值开始,然后在数组中循环,跳过任何相同的值,然后返回第一个不相同的值。它不会找到唯一的值,只会找到不等于第一个值的第一个值。例如,在数组
[1,2,2,2,2]
上尝试它,结果将是2而不是1,尽管这显然是错误的

相反,您可以创建每个值及其关联度的映射,然后按末尾等于1的值进行过滤

function findOne(arr) {
    const incidences = arr.reduce((map, val) => {
      map[val] = (map[val] || 0) + 1;
      return map;
    }, {});
    const values = Object.keys(incidences);
    for (let i = 0; i < values.length; ++i) {
      if (incidences[values[i]] === 1) { return values[i]; }
    }
    return null;
}

通过使用贴图计算每个元素出现的次数,可以获得一次出现的所有值。然后,可以将该映射缩减为唯一值数组:

const findUnique=arr=>{
const mapEntries=[…arr.reduce((a,v)=>a.set(v,(a.get(v)| | 0)+1),new Map()).entries()]
返回mapEntries.reduce((a,v)=>(v[1]==1&&a.push(v[0]),a),[]))
}
log(findUnique([3,10,3,3,3]))
log(findUnique([1,2,3,2,4]))

log(findUnique([4,10,4,5,3])
你的代码很复杂,试试这个

function findOne(arr) {
  const uniqueItems = [];
  arr.forEach(item => {
    const sameItems = arr.filter(x => x === item);
    if (sameItems.length === 1) {
      uniqueItems.push(item);
    }
  });

  return uniqueItems;
}
console.log(findOne([0, 1, 1, 3, 3, 3, 4]));
我正在从传递的数组中获取所有唯一项,它可能有多个唯一项考虑以下几点:

回想一下,a
span=max-min+1

分区P1
成为
span
0..span-1

分区P2
设为
span
from
span..(2*span)-1

如果不在
P2
中,则在
P1
中放置一个数字

如果编号已在
P1
中,则将其放在
P2

一旦数字在<代码> P2< /代码>中,<强>不要再考虑< <强> > /p>


如果一个数字在
P1
中,那么它是唯一的

这是一种更简单、更快速的方法:

function findOne(arr) {
  const a = arr.reduce((acc, e) => {
    e in acc || (acc[e] = 0)
    acc[e]++
    return acc
  }, {})
  return Object.keys(a).filter(k => a[k] === 1)[0] || null
}


因为你设置了x,用所有3'测试它如果你需要数组中唯一的元素,
reduce
将是一个更干净的方法如果你不点击你的
continue
,你总是点击
return
不,只有一个int…没问题,我只是想帮助您学习:)我还意识到我的原始代码会将所有值更改为字符串,所以我添加了另一个版本,它使用实际映射来保留类型。(它返回一个包含所有唯一值的数组,如果没有,则返回一个空数组。)其思想是,对于每个值,如果以前未看到该值,则将该值的映射设置为0,或者使用当前值;然后加1。这将为您提供所有值的地图以及它们出现的频率;然后你寻找一个恰好出现一次的,并返回它。它失败了。。。对我来说,理解你的代码也很复杂。通过考试不是最重要的。我也需要了解我的解决方案…它是如何失败的?我用输入数组[0,1,1,2,2,3,3]对它进行了测试,它返回结果数组
[0]
,这是正确的,因为0是唯一的重复值。(我试图在我之前的评论中解释代码;如果您对它有任何不理解的地方,请随时提问!:)它失败了:我得到了:预期的:1,取而代之的是:[1]预期的:2,取而代之的是:[2]预期的:10,取而代之的是:[10]这不是很多信息,但它不会传递……正如我所说的,它返回一个唯一值数组(由其周围的
[]
括号表示);看起来测试只需要不带数组的值。因此,您可以只返回结果的第一个数组元素,而不是整个数组,对于那些只有一个唯一值的情况,它可以正常工作。它也不会通过…它比我的解决方案更难失败…我只有一个唯一的int…@TiagoRuivo我刚刚测试过,它确实通过了work;它返回一个唯一值的数组。若只想检查一个值,则可以获取结果的第一个条目。当此操作起作用时,forEach中的筛选器表示它在O(n^2)处运行效率,这比它需要的要慢得多…这是任务:有一个包含一些数字的数组。除了一个之外,所有数字都相等。尝试找到它!findUniq([1,1,1,2,1,1])===2 findUniq([0,0,0,0.55,0,0]))===0.55保证数组包含3个以上的数字。您应该记录您的代码。您引入了许多新概念(
reduce
Set
Map
等)OP可能不一定能理解。这就做到了,但是对于我来说,理解所有变量是非常高级的…你能在排序数组之后一步一步地解释一下吗?@TiagoRuivo你使用的是哪个版本?我会尽力解释。第二个…如果你澄清你的代码以获得更简单的JS。更具描述性的类型对于…@TiagoRuivo,首先,我对数组进行排序,使它们都按顺序排列,只要重复项彼此相邻,顺序就无关紧要。例如,[2,3,2]将排序为[2,2,3]。然后我们检查第一个值是否等于第二个值。我们知道如果相同,那么最后一个值将是唯一值,因为只有两种不同类型的值。否则,如果前两个值不相同,那么第一个值是非重复值。if语句要检查的是检查数组是否长于2个元素nts很长,这是必须的,否则两者都可能是唯一的。
function findOne(arr) {
  const a = arr.reduce((acc, e) => {
    e in acc || (acc[e] = 0)
    acc[e]++
    return acc
  }, {})
  return Object.keys(a).filter(k => a[k] === 1)[0] || null
}