如何修复在两个特定数组中返回“ undefined”的代码?

时间:2019-02-03 17:44:10

标签: javascript arrays for-loop slice

我是JavaScript的入门者,目前在Code Wars接受培训,在这里我的代码有一些问题。我有一个任务,要在给定数组中查找一个数字,该数字不同于同一数组中的其他数字。当我仅在这两个特定数组上运行测试时,代码返回“未定义”。所以我想知道为什么以及如何改善我的代码?也许我错过了一些东西。 感谢您的帮助。

这是我的代码:

function findUniq(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== arr[0]  && arr[i] !== arr.slice(-1)[0]) {
      return arr[i]; 
    } 
  }
}

所以我有这两个数组:

findUniq([0, 1, 1, 1, 1, 1, 1, 1]);应该是0,但返回undefined

findUniq([8, 8, 8, 8, 8, 8, 8, 7]);预期7,也返回undefined

4 个答案:

答案 0 :(得分:1)

您还可以使用reduce到club数字作为键值对,然后查找值1的键

function findUniq(input){
  let op = input.reduce((op,inp)=>{
    if(op[inp]){
      op[inp]++;
    } else {
      op[inp] = 1
    }
    return op
  },{})
  return Object.keys(op).find(e=> op[e] === 1)
}

console.log(findUniq([0, 1, 1, 1, 1, 1, 1, 1]))
console.log(findUniq([8, 8, 8, 8, 8, 8, 8, 7]))

答案 1 :(得分:0)

对于数组中的每个元素,您检查它是否不等于第一个最后一个位置:

s

现在对于第一个元素(要查找的元素),与最后一个元素进行比较将导致“不相等”,因为0不是1,但是在比较第一个元素时将检查“等于”元素本身。


要使其检测第​​一个和最后一个元素,请不要检查它是否不等于第一个和最后一个元素,但是如果它不等于上一个和下一个元素,则在索引离开索引时跳回到末尾或开始数组。

通过它对于最后一个元素和第一个元素也起作用:

 //❌                    ✔️
 //                    
   [0, 1, 1, 1, 1, 1, 1, 1]
 //⬆️

答案 2 :(得分:0)

也许最简单的方法是,如乔纳斯·威尔姆斯(Jonas Wilms)所建议的那样,找到第一个不等于其前任和后任的人,并排在列表的末尾:

const findUnique = arr => arr.find((n, i, a) => 
  n !== a[(i - 1) % arr.length] && n !== a[(i + 1 % arr.length)]
)

console.log(findUnique([1, 1, 3, 1, 1, 1, 1, 1])) //~> 3
console.log(findUnique([0, 1, 1, 1, 1, 1, 1, 1])) //~> 0
console.log(findUnique([8, 8, 8, 8, 8, 8, 8, 7])) //~> 7

请注意,它使用Java的remainder or modulus操作符%处理列表末尾的滑动。

答案 3 :(得分:0)

 function findUniq(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== arr[arr.length - (i-1)] && arr[i] !== arr[arr.length + (i-1)] && arr[i] !== arr[i+1] && arr[i] !== arr[i-1]) {
     return arr[i]; 
    } 
  }
}

这是我自己的回答,感谢大家,我会注意您的任何批评家,以求改进。感谢乔纳斯·威尔姆斯:)