2014-02-08 98 views
0

我試圖將彼此共同的值分組,其思想是對於與第一個單詞匹配的每個字母,然後將它們組合在一起。按常見值分組

問題是我不能將其他匹配值添加到對象。 我想知道我出錯的地方。

var alphabet = ["A","B","W","D","H"]; 
var names = ["Ant","Water","Deer","Bee","Dog"]; 

var group = {}; 

for(var key in alphabet) { 
    var value = alphabet[key]; 

    // console.log(value); 
    // group[value] = ""; 

    for(var let in names){ 
     var letters = names[let]; 

     if(value == letters .substr(0, 1)){ 
      group[value] = letters; 

      //console.log(letters); 
     } 
    } 
} 

console.log(group) 

回答

2

試試這個

if(value == letters .substr(0, 1)){ 
// add empty array if not exists for that alphabate....... 
if (!group[value]) { 
    group[value] = []; 
} 
      group[value].push(letters); 

      //console.log(letters); 
     } 
2

有幾件事你需要注意這裏。第一個是你不應該在數組上使用for/in,只有對象(你可以選擇添加到數組中的非數字屬性;也可以迭代亂序;這兩個問題很難診斷)。

其次,let是JavaScript中的一個保留字:它目前沒有使用,但它將在ES6中,並且它已經在「保留供將來使用」類別很長一段時間了。

我將如何改寫這個:

var alphabet = ['A', 'B', 'W', 'D', 'H']; 
var names = ['Ant', 'Water', 'Deer', 'Bee', 'Dog']; 
var groups = {}; 

alphabet.forEach(function(letter){ 

    groups[letter] = []; 

    names.forEach(function(name){ 
     if(name.substring(0,1)==letter){ 
      groups[letter].push(name); 
     } 
    }); 
}); 

這種做法可能會導致空組(H,在這個例子中)。如果你想避免這種情況,你可以簡單地刪除空的組,或者你可以這樣做:

alphabet.forEach(function(letter){ 

    names.forEach(function(name){ 
     if(name.substring(0,1)==letter){ 
      if(!groups[letter]) groups.letter = []; 
      groups[letter].push(name); 
     } 
    }); 
}); 
+0

感謝您的意見 – david

+0

感謝您投票的幫助 – david

1

這種方法怎麼樣?利用對象的持續時間查找。

var names = {"ant":true, "water": true, "deer" : true, "bee": true, "dog": true}; 
var alphabet = {"a": true, "b": true, "w" : true, "d": true, "h": true} 

var groups = {}; 

for(var key in names){ 
    var firstLetter = key[0]; 
    if(firstLetter in alphabet){ 
     groups[key] = firstLetter; 
    } 
} 
+1

謝謝你,起來投了 – david

2

是否真的需要這裏的alphabet陣列?根據你的價值判斷你需要什麼組合會更有意義嗎?這裏是你如何能做到這一點:

var groups = {}; 

names.forEach(function(name) { 
    var initial = name[0]; 
    if(!groups[initial]) { 
    groups[initial] = []; 
    } 
    groups[initial].push(name); 
}); 

注意,這爲O(N)的運行時間複雜度,而嵌套for/forEach方法有O(M * N)的運行時間。換句話說,這比嵌套的方法更有效率。

如果你想可用組限制爲那些在alphabet,你仍然可以做到這一點有效,方法如下:

var groups = {}; 

alphabet.forEach(function(group) { 
    groups[group] = []; 
} 

names.forEach(function(name) { 
    var initial = name[0], group = groups[initial]; 
    if(group) { 
    group.push(name); 
    } 
}); 
+0

是的,這是需要的字母數組 – david

+0

@david好的,在這種情況下,請看我的第二個代碼示例(並請解釋爲什麼''''數組是必要的)。 – JLRishe

+0

謝謝你投票給你的幫助 – david