当前位置: 代码迷 >> JavaScript >> findTwins,它接受一个整数数组并找到两个相同的数字并返回重复两次的数字
  详细解决方案

findTwins,它接受一个整数数组并找到两个相同的数字并返回重复两次的数字

热度:72   发布时间:2023-06-07 11:43:32.0

我遇到错误,并且知道为什么'count'返回错误。 请帮忙。

编写一个名为findTwins的函数,该函数接受整数数组并找到两个相同的数字,然后返回重复两次的数字。 如果没有重复两次的数字,该函数应返回null。

 function findTwins(arr) { if (arr.length === 0) return null; let count = {}; //count occurances of each item for (let i = 0; i < arr.length; i++) { let num = arr[i]; //if element isn't in given key, assign it value '0' if (count[num] === undefined) { count[num] = 0; } //if element has occured in object, increase it by 1 count[num]++; } //iterate through count object for (let key in count) { //if value of count is 2, returns that key if (count[key] === 2) { return key; //if there are no repeats in array, return null } else { (count[key] === 0) { return null; } } } } console.log( findTwins([2, 3, 6, 34, 7, 8, 2]), // 2 findTwins([]), // null findTwins([3, 1, 4, 2, 5]) // null ) 

  • 您在(count[key] === 0) {

  • 您需要在函数末尾return null以处理不匹配项

  • 我不会for (let key in count) {数组使用for (let key in count) { -比对象遍历更安全,更好的方法来迭代数组

  • 减少或过滤是处理数组的更好方法:

这是基于的解决方案

 function findTwins(arr) { let ret = null; if (arr && arr.length) ret = arr.filter(function(value, index, self) { return (self.indexOf(value) !== index) }) return !ret || ret.length == 0 ? null : ret; } console.log( findTwins([2, 3, 6, 34, 7, 8, 2]), // 2 findTwins([]), // null findTwins([3, 1, 4, 2, 5]) // null ); 

她是基于建议的版本

 function findTwins(arr) { let res = []; if (arr && arr.length) { for (let i = 0; i < arr.length; i++) { var num = arr[i]; if (arr.indexOf(num) !== arr.lastIndexOf(num) && res.indexOf(num) === -1) res.push(num) } } return res.length ? res : null; } console.log( findTwins([2, 3, 6, 34, 7, 8, 2]), // 2 findTwins([]), // null findTwins([3, 1, 4, 2, 5]), // null findTwins([3, 1, 2,5,4, 2, 5]) // null ) 

您在这里遇到语法错误, if

else {
      (count[key] === 0) {  //<- here you missed if
        return null;
      }
    }

更好的方法是使用减少

 function findTwins(input){ let twins = input.reduce((op,inp)=>{ if(op.entry[inp]){ op.entry[inp]++; if(op.entry[inp] === 2){ op.twins.push(inp) } } else{ op.entry[inp] = 1 } return op },{twins:[],entry:{}}) return twins.twins.length > 0 ? twins.twins : null } console.log( findTwins([2, 3, 6, 34, 7, 8, 2]), // 2 findTwins([]), // null findTwins([3, 1, 4, 2, 5]), // null findTwins([3, 1, 4, 2, 5,5,2,3,1,4]) ) 

如果您只想返回出现次数比在本例中循环的次数多一倍的数字

 function findTwins(input){ let twins = input.reduce( (op,inp) => ( (op[inp]? op[inp]++ : op[inp] = 1),op),{}) let final = Object.keys(twins).reduce((op,key) => ((twins[key]===2 ? op.push(+key) : op ),op),[]) return final.length > 0 ? final : null } console.log( findTwins([2, 3, 6, 34, 7, 8, 2]), // 2 findTwins([]), // null findTwins([3, 1, 4, 2, 5, 5, 5, 5]), // null ) 

使用indexOf和lastIndexOf可以获取位置,并通过该位置获取数组中重复的元素。

 var x = [2, 3, 6, 34, 7, 8, 2] const c = x.filter(v => { if (x.indexOf(v) !== x.lastIndexOf(v)) { x.splice(x.lastIndexOf(v)) return v; } }) console.log(c)