按共同价值观分组

时间:2014-02-08 06:39:29

标签: javascript arrays sorting object

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

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

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)

4 个答案:

答案 0 :(得分: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);
        }
    });
});

答案 1 :(得分: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 :(得分: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)。换句话说,这比嵌套的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);
  }
});

答案 3 :(得分: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;
    }
}