我是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
。
答案 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];
}
}
}
这是我自己的回答,感谢大家,我会注意您的任何批评家,以求改进。感谢乔纳斯·威尔姆斯:)