首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历对象数组

遍历对象数组
EN

Stack Overflow用户
提问于 2019-08-07 16:00:10
回答 3查看 97关注 0票数 1

我需要遍历一个对象数组,并提示用户输入一个学生的名字。如果名称存在,我需要将学生的数据打印到屏幕上,否则继续迭代,直到用户类型退出。

我遇到的问题是,如果我键入最后一个对象的学生名称,学生的记录将在循环完成之前不会打印。

请参阅以下代码:

代码语言:javascript
复制
var students = [{
    name: 'hacene',
    track: 'Full Stack JavaScript',
    achievements: 12,
    points: 1226
  },
  {
    name: 'dave',
    track: 'PHP Development',
    achievements: 128,
    points: 14868
  },
  {
    name: 'layla',
    track: 'iOS Development',
    achievements: 8,
    points: 901
  },
  {
    name: 'mika',
    track: 'Front-End Development',
    achievements: 15,
    points: 1666
  },
  {
    name: 'heisenberg',
    track: 'Blue Meth Manufacturing',
    achievements: 99,
    points: 9999
  }
];

var student;
var records = '';
var search;

// Print function to print the content
function print(message) {
  var outputDiv = document.getElementById('output');
  outputDiv.innerHTML = message;
}

// Access each students records in the array / a loop is needed to achieve this
for (var i = 0; i < students.length; i++) {
  student = students[i];
  console.log(student);
  search = prompt('Please enter a student\'s name to see his records: ');
  search = search.toLocaleLowerCase();
  console.log(search);
  if (search === student.name) {
    records += '<h2><strong>Student: ' + student.name + '</strong><h2>';
    records += '<p>Track: ' + student.track + '</p>';
    records += '<p>Points: ' + student.points + '</p>';
    records += '<p>Achievements: ' + student.achievements + '</p>';
    break;
  } else if (search === 'quit') {
    break;
  }
}

// Print the students' name; track, achievments and points
print(records);

我需要的是,能够从第一个提示符打印学生的记录,即使他是名单上的最后一个。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-08 14:19:01

你所做的更像是一个猜谜游戏:“在for循环中找到当前学生的名字”,我不知道你是否还需要一个答案,但下面是:

只需将提示放在for循环之前即可。在提示符之后,执行循环并在找到结果时停止。

代码语言:javascript
复制
var students = [{
    name: 'hacene',
    track: 'Full Stack JavaScript',
    achievements: 12,
    points: 1226
  },
  {
    name: 'dave',
    track: 'PHP Development',
    achievements: 128,
    points: 14868
  },
  {
    name: 'layla',
    track: 'iOS Development',
    achievements: 8,
    points: 901
  },
  {
    name: 'mika',
    track: 'Front-End Development',
    achievements: 15,
    points: 1666
  },
  {
    name: 'heisenberg',
    track: 'Blue Meth Manufacturing',
    achievements: 99,
    points: 9999
  }
];

var student;
var records = '';
var search;

// Print function to print the content
function print(message) {
  var outputDiv = document.getElementById('output');
  outputDiv.innerHTML = message;
}
  search = prompt('Please enter a student\'s name to see his records: ');
// Access each students records in the array / a loop is needed to achieve this
for (var i = 0; i < students.length; i++) {
  student = students[i];
  search = search.toLocaleLowerCase();

  if (search === student.name) {
    records += '<h2><strong>Student: ' + student.name + '</strong><h2>';
    records += '<p>Track: ' + student.track + '</p>';
    records += '<p>Points: ' + student.points + '</p>';
    records += '<p>Achievements: ' + student.achievements + '</p>';
    break;
  }
}

// Print the students' name; track, achievments and points
print(records);
代码语言:javascript
复制
<div id="output"></div>

您可以在循环中添加一个if语句。

代码语言:javascript
复制
if( search != "quit") {
for (var i = 0; i < students.length; i++) {
  student = students[i];
  search = search.toLocaleLowerCase();

  if (search === student.name) {
    records += '<h2><strong>Student: ' + student.name + '</strong><h2>';
    records += '<p>Track: ' + student.track + '</p>';
    records += '<p>Points: ' + student.points + '</p>';
    records += '<p>Achievements: ' + student.achievements + '</p>';
    break;
  }
}
}

有了它,如果您输入退出,您将不会进入循环。

即使它不能满足您的需求,更好的方法是使用find方法。

代码语言:javascript
复制
var students = [{
    name: 'hacene',
    track: 'Full Stack JavaScript',
    achievements: 12,
    points: 1226
  },
  {
    name: 'dave',
    track: 'PHP Development',
    achievements: 128,
    points: 14868
  },
  {
    name: 'layla',
    track: 'iOS Development',
    achievements: 8,
    points: 901
  },
  {
    name: 'mika',
    track: 'Front-End Development',
    achievements: 15,
    points: 1666
  },
  {
    name: 'heisenberg',
    track: 'Blue Meth Manufacturing',
    achievements: 99,
    points: 9999
  }
];

var student;
var records = '';
var search;



// Print function to print the content
function print(message) {
  var outputDiv = document.getElementById('output');
  outputDiv.innerHTML = message;
}
function write(student) {
    records += '<h2><strong>Student: ' + student.name + '</strong><h2>';
    records += '<p>Track: ' + student.track + '</p>';
    records += '<p>Points: ' + student.points + '</p>';
    records += '<p>Achievements: ' + student.achievements + '</p>';
    print(records);
}


search = prompt('Please enter a student\'s name to see his records: ');
student = students.find((element) => {
  if (element.name == search) {
    return true;
  }
})
if (student) {
  write(student);
  
};

// Print the students' name; track, achievments and points
代码语言:javascript
复制
<div id="output"></div>

票数 2
EN

Stack Overflow用户

发布于 2019-08-07 16:04:42

我需要遍历一个对象数组,并提示用户输入一个学生的名字。如果名称存在,我需要将学生的数据打印到屏幕上,否则继续迭代,直到用户类型退出。

你需要重新考虑你的算法:

代码语言:javascript
复制
get input from user
while user does not enter "quit"
    for each object in list
       if name is the same as input
           output the record
    get input from user

请注意,您需要从用户获得输入,然后遍历列表以搜索正确的对象。

或者,您可以使用对象而不是列表。这个外部对象将以学生的名字作为键,将对象记录作为值。现在,您可以对用户输入的学生姓名进行索引,以直接获取记录,而不是在列表中搜索。

票数 0
EN

Stack Overflow用户

发布于 2019-08-07 16:07:22

您需要继续提示用户,直到他们输入退出或您有匹配为止,而不是遍历学生以提示用户。

就像这样:

代码语言:javascript
复制
var quit = false
while(!quit) {
    search = prompt('Please enter a student\'s name to see his records: ');
    search = search.toLocaleLowerCase();

    if (search === 'quit') {
        quit = true;
        continue;
    }

    // search for student here and if match is found then set quit to true
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57398320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档