我对此和javascript有了新的认识。我试图解决一个练习,即在数组中找到重复的字母a
。要做的是使用基本结构(没有正则表达式既不是javascript的新方法(只有ES5))。我需要这样做才能理解语言的基础。
输出必须是:
//美国队长,这封信' C' => 2次。
//美国队长,这封信' A' => 4次。
//美国队长,这封信'我' => 2次。
我不是在寻找解决方案,只是寻找解决方案的方法和逻辑结构。欢迎任何建议。
我的方式,但它不起作用:
function duplicateLetter(name) {
var newArray = [];
for (var i=0; i<name.length; i++) {
console.log(name[i].indexOf(newArray));
if (name[i].indexOf(newArray) === 0) {
newArray.push(name[i]);
}
}
console.log(newArray);
//console.log(name + ", the letter '" + (newArray[0]).toUpperCase() + "' => " + newArray.length + " times");
}
duplicateLetter("Captain America");
答案 0 :(得分:2)
function duplicateLetter(o) {
var arr = o.toUpperCase().split('');
var obj = {};
for(var v in arr) {
obj[arr[v]] = obj[arr[v]] || 0;
obj[arr[v]]++;
}
for(var v in obj) {
console.log(o + ", the letter '" + v + "' => " + obj[v] + ' times.');
}
}
duplicateLetter("Captain America");
解释:
arr[v]
成为我们的信件,并且:
arr[v]
,我们会将其设置为0
。arr[v]
的值(这会导致obj ['c']在每次字母为c时递增。您可以注意到这会跟踪我们的字母数量字符串。请注意,这会将空格字符视为字母。如果您想要一个没有的答案,请注明。
这是一个不同的答案,它不使用对象,只计算字母(而不是空格或标点符号)来证明一切都可能以多种方式实现。
// Not using objects and not counting anything but letters.
function duplicateLetter(o) {
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var arr = o.toUpperCase().split('');
var count = [];
for(var v in arr) {
pos = letters.indexOf(arr[v]);
if(pos < 0) continue; // It wasn't a letter.
count[pos] = count[pos] || 0;
count[pos]++;
}
for(var v in count) {
if(!(count[v] > 0)) continue; // The letter never appeared.
console.log(o + ", the letter '" + letters[v] + "' => " + count[v] + ' times.');
}
}
duplicateLetter("Captain America");
我可能也会尝试一个完全不使用数组的答案!
修改强> 您可以使用(a in b)循环来迭代数组和对象。这是因为数组实际上只是一个对象,其中所有可枚举属性都有整数索引:
arr = [10,15,"hi"]
几乎与Javascript内部工作方式的arr = {'0' : 10, '1' : 15, '2' : "hi"}
相同。因此,for(v in arr)将正常迭代数组。
根据要求,与正常的循环相同的答案:
// Not using objects and not counting anything but letters.
function duplicateLetter(o) {
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var arr = o.toUpperCase().split('');
var count = [];
for(var v = 0; v < arr.length; v++) {
pos = letters.indexOf(arr[v]);
if(pos < 0) continue; // It wasn't a letter.
count[pos] = count[pos] || 0;
count[pos]++;
}
for(var v = 0; v < count.length; v++) {
if(!(count[v] > 0)) continue; // The letter never appeared.
console.log(o + ", the letter '" + letters[v] + "' => " + count[v] + ' times.');
}
}
duplicateLetter("Captain America");
请注意,for strong中的没有任何改变。在我看来,for-in表示法让人脑更容易理解,这也是我使用它的原因。
至于count[pos] = count[pos] || 0;
,解释它为什么会这样做是非常繁琐的,因为它要求你准确地知道||
运算符的作用。所以我只是说明它的作用,而不解释它。
基本上,count[pos] = count[pos] || 0;
与:
if(count[pos]) { // If count[pos] evaluates to true.
count[pos] = count[pos]
} else { // count[pos] is false, '', null, undefined, 0, or any other value that evaluates to false.
count[pos] = 0;
}
请注意,这是有效的,因为在开始时,count[pos]
是undefined
(count
是一个空数组),因此它会在其中放置0
。如果我们再次找到该字母,count[pos]
已定义,并且是正值,因此评估为true
,因此我们不会更改它。
只需将a = a || b
视为等于:
如果
b
为a
(或通过任何其他方式评估为a
),请将undefined
的默认值设为false
。“
答案 1 :(得分:0)
创建一个对象,其键是字母,值是该字母重复的次数。例如, &#39; ABBC&#39; =&GT; {&#39; a&#39;:1,&#39; b&#39;:2,&#39; c&#39;:1}