【问题标题】:Group by Common Values按共同价值观分组
【发布时间】:2014-02-08 06:39:29
【问题描述】:

我正在尝试对彼此相同的值进行分组,其想法是对于与第一个单词匹配的每个字母,然后将它们组合在一起。

问题是我无法向对象添加额外的匹配值。 我想知道我哪里出错了。

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)

【问题讨论】:

    标签: javascript arrays sorting object


    【解决方案1】:

    试试这个

    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);
              }
          });
      });
      

      【讨论】:

        【解决方案3】:

        这里真的需要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)。换句话说,这比嵌套的for/forEach 方法要高效得多。

        如果您想将可用组限制为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);
          }
        });
        

        【讨论】:

        • @david 好的,在这种情况下,请查看我的第二个代码示例(请解释为什么需要 alphabet 数组)。
        【解决方案4】:

        这种方法怎么样。利用对象的恒定时间查找。

        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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-25
          • 1970-01-01
          • 1970-01-01
          • 2017-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-17
          相关资源
          最近更新 更多