如何循环通过JavaScript对象并更改值?

时间:2019-02-08 12:06:32

标签: javascript

到目前为止,我有这个:

var text = 'This is a sentence.';
var character;
var vowelAmount = {
    a = 0,
    e = 0,
    i = 0,
    o = 0,
    u = 0
}

for (i = 0; i < text.length; i++){
    character = text.charAt(i);
    for (var key in vowelAmount){
        if (key == character){
            vowelAmount[key]++;
        }
    }
}
for (var key in vowelAmount){
    document.write(key + '<br>');
}

应该在文本中显示所有元音,但是它什么也没做。 我敢肯定有一种方法可以更有效地做到这一点,但是我想保留这种结构,因为它是用于学校的,他们不想让我用于循环...

4 个答案:

答案 0 :(得分:1)

根据我的评论:如果您的代码不起作用,请始终记住首先检查您的浏览器控制台:它始终包含有关出现问题的非常有用的信息。就您而言,第一个错误是在对象声明中使用=。请改用:

此外,您的代码块:

for (var key in vowelAmount){
    document.write(key + '<br>');
}

...仅用于打印对象中的(例如a),而不是其值(每个元音的计数)。要访问键值对中的对象中的值,可以通过其索引vowelAmount[key]来访问它。

有关工作示例,请参见下面的概念验证:

var text = 'This is a sentence.';
var character;
var vowelAmount = {
    a: 0,
    e: 0,
    i: 0,
    o: 0,
    u: 0
}

for (var i = 0; i < text.length; i++){
    character = text.charAt(i);
    for (var key in vowelAmount){
        if (key == character){
            vowelAmount[key]++;
        }
    }
}

for (var key in vowelAmount){
    document.write(key + ': ' + vowelAmount[key] + '<br>');
}

改进说明

另一方面,我通常强烈建议不要使用document.write,因为它会覆盖文档中的所有内容。您应该改为创建一个新元素,并将其附加到DOM本身。甚至更好:如果您希望示例在语义上100%正确,那么最好的选择是使用无序列表。

此外,您不需要重复嵌套for循环:您可以直接针对vowelAmount对象检查字符:

var text = 'This is a sentence.';
var character;
var vowelAmount = {
    a: 0,
    e: 0,
    i: 0,
    o: 0,
    u: 0
}

for (var i = 0; i < text.length; i++){
    character = text.charAt(i);
    if (character in vowelAmount) {
        vowelAmount[character]++;
    }
}

// Create dummy `<ul>` parent
var ul = document.createElement('ul');

// Iterate through your object and create new `<li>` element per key-value pair
// Also, once the `<li>` is created, we then inject it into `<ul>`
for (var key in vowelAmount){
  var li = document.createElement('li');
  li.textContent = key + ': ' + vowelAmount[key];
  ul.appendChild(li);
}

// When you're done, we can append `<ul>` to the body
document.body.appendChild(ul);

答案 1 :(得分:0)

您需要更正对象创建语法。在显示每个元音的计数时,还请注意更改。

var text = 'This is a sentence.';
var character;
var vowelAmount = {
    a : 0,
    e : 0,
    i : 0,
    o : 0,
    u : 0
}

for (i = 0; i < text.length; i++){
    character = text.charAt(i);
    for (var key in vowelAmount){
        if (key == character){
            vowelAmount[key]++;
        }
    }
}
for (var key in vowelAmount){
    document.write(key + '='+vowelAmount[key]+'<br>');
}

答案 2 :(得分:0)

由于这是上学,因此我不会通过提供工作代码来给您喂食,但我鼓励您看一下以下几点:

  1. 您对vowelAmount的对象语法不正确。使用键值对设置对象。使用:(冒号)的左侧和冒号右侧的值定义键的位置。在您的示例中,您正在使用=。这必须是冒号:

    例如:

    var person = {
      name: 'Nick', /* NOT: name = 'Nick' */
      age: 1000 /* NOT: age = 1000 */
    }
    
  2. 您的下一个问题是如何显示您的价值观。目前,您仅在对象中显示key。如果要显示keyvalue(即元音和元音计数),则需要使用bracket notation访问value

    例如:

    var key = 'name';
    console.log(person[key]); // gives back "Nick"
    

使用这些想法,您应该能够解决问题。

答案 3 :(得分:0)

我认为,这就是您想要的。

您的代码中有几个错误。

  1. JS对象是错误的。使用:代替=
  2. 不需要两个循环。

var text = 'This is a sentence.';
var character;
var vowelAmount = {
    a: 0,
    e: 0,
    i: 0,
    o: 0,
    u: 0
}

for (const char of text) {
  if (vowelAmount.hasOwnProperty(char)) {
  	vowelAmount[char] += 1; 
  }
}

console.log('vowelAmount = ', vowelAmount);