2016-07-08 96 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' ] 
相關問題