我正在尝试对彼此相同的值进行分组,这个想法是,对于与第一个单词匹配的每个字母,然后将它们组合在一起。
问题是我无法将额外匹配的值添加到对象中。 我想知道我哪里出错了。
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)
答案 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;
}
}