2014-02-08 89 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