2016-07-08 169 views
1

给定一个单词数组,写入一个函数,该函数返回出现偶数次单词的数组。查找数组中出现偶数次的单词 - Javascript

function even(["hello", "hi", "hello", "elephant", "hi"]); 

即输出应该是:

["hello", "hi"] 

这是一个玩具的问题,我一直在挣扎与最近。我已经解决了类似的问题,计算并返回数组中元素的出现次数,但是无法采用该逻辑并将其应用于此问题。

这是我到目前为止已经试过,但试图只输出甚至出现时都碰了壁:

function even(collection) { 
    var results = []; 
    for(var i = 0; i < collection.length; i++){ 
    var value = collection[i]; 
    if(results[value]){ 
     results[value] = results[value] + 1; 
    }else{ 
    results[value] = 1; 
    } 
} 
     return results; 
} 
+1

的[找到一个JavaScript数组中重复的值最简单的方法(HTTP可能重复:// stackoverflow.com/questions/840781/easiest-way-to-find-duplicate-values-in-a-javascript-array) –

+0

我错误阅读和回答,但在编辑之前添加正确答案,@tymeJV已发布一个正确的答案。我的已被删除。 – Jacques

回答

2

您可以使用reduce获得的字的实际数量,然后简单地回有一个的那些阵列甚至数:

function even(wordsArr) { 
    //Object of words and counts 
    var wordCounts = wordsArr.reduce(function(counts, word) { 
     if (!counts.hasOwnProperty(word)) { 
      counts[word] = 0; 
     } 

     counts[word]++; 
     return counts; 
    }, {}); 

    //Now filter that out and return 
    return Object.keys(wordCounts).filter(function(word) { 
     return wordCounts[word] % 2 === 0 
    }); 
} 

even(["hello", "hi", "hello", "elephant", "hi"]); //["hello", "hi"] 
0

var arr = ["hello", "hi", "hello", "elephant", "hi"]; 
 

 

 
function onlyEvens(arr) 
 
{ 
 
    var countObj = {}; 
 
    for(var i = 0; i < arr.length; i++) 
 
    { 
 
    var item = arr[i]; 
 
    
 
    if(countObj[ item ] !== undefined) 
 
     countObj[item]++; 
 
    else 
 
     countObj[item] = 1; 
 
    }//for() 
 
    
 
    var filteredArray = []; 
 
    
 
    for(var key in countObj) 
 
    { 
 
    if(countObj[key] % 2 == 0) 
 
     filteredArray.push(key); 
 
    } 
 
    
 
    return filteredArray; 
 
}//onlyEvens() 
 

 
console.log(onlyEvens(arr));

0

问题在你的代码:

  • 您使用collection代替words
  • 你不能访问数组的关联方式。您必须声明为对象:

    results[value]

  • 返回result变量,但它是未申报。

    return result;

  • 结果只包含每个单词的出现。如果一个词的出现是奇数或偶数,那么就会错过计算代码。

固定代码:

function even(words) {  // <<< in your code was collection 
    var results = {}; 
    for(var i = 0; i < words.length; i++){ 
    var value = words[i]; 
    if(results[value]){ 
     results[value] = results[value] + 1; 
    }else{ 
     results[value] = 1; 
    } 
    } 
    var ret = []; 
    for(var word in results) 
    if(results[word]%2 !== 0) 
     rest.push(word); 

    return ret; 
} 
+0

这只是他的代码很多错误之一。这不是一个解决他的问题 – JSantos

+0

好吧要编辑我的答案谢谢 – morels

0

function even(list) { 
 
    var d = list.reduce(function(d, w) { d[w] = !d[w]; return d; }, {}); 
 
    return Object.keys(d).filter(function(w) { return !d[w]; }); 
 
} 
 

 
console.log(even(["hello", "hi", "hello", "elephant", "hi"])); 
 
console.log(even(["hello", "yo", "yo", "hi", "hello", "yo", "elephant", "hi"]));

说明:使用array .reduce() method创建一个对象(d)提供有各个词(w)的性质与一个布尔值,表示该单词是否具有奇数发生次数。然后.filter()keys得到所有那些是而不是奇数。

0

如果您之前对数组进行排序,如只是这样的代码行需要,您可以将其过滤:

var even = (str) => str.sort().filter((element, index, arr) => index+1 === arr.lastIndexOf(element)); 

console.log(even(["hello", "hello", "hi", "elephant", "hi", "hi"])); //[ 'hello', 'hi' ] 
相关问题