循环遍历带有对象的数组以检索属性

时间:2016-05-24 16:34:18

标签: javascript

我正在开设免费代码营的课程,我被困在某个项目上。我不认为我的循环工作正常,因为它不会检索它应该的信息。

说明如下:

  

我们有一组代表不同人的对象   联系人列表。

     

一个lookUpProfile函数,它将firstName和一个属性(prop)作为   已为您预先写好了论据。

     

该函数应检查firstName是否为实际联系人   firstName和给定属性(prop)是该联系人的属性。

     

如果两者都为真,则返回该属性的“值”。

     

如果firstName与任何联系人不对应,则返回“No such   联系“

     

如果道具与任何有效的属性不对应,则返回“否”   这样的财产“

//Setup
var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];


function lookUpProfile(firstName, prop){
// Only change code below this line
  for (i = 0; i < contacts.length; i++) {

      if (contacts[i].hasOwnProperty(firstName)) {
        if (contacts[i].firstname === prop) {
          return contacts[i].firstName;
        }
        else {
          return "No such property";
        }
      }
      else {
        return "No such contact";
      }
  }
// Only change code above this line
}

// Change these values to test your function
lookUpProfile("Akira", "likes");

我不确定遗憾的是我的问题在哪里,我们非常感谢任何帮助。

6 个答案:

答案 0 :(得分:1)

您的代码有几件事情不对。

首先,hasOwnProperty没有按照您的想法行事。阅读the docs on that

此外,Javascript区分大小写,并将未定义的属性报告为类型undefined的值。因此,以下if并不能完全符合您的要求,而不会产生错误。

if (contacts[i].firstname === prop) {
    return contacts[i].firstName;
}

请注意第一个 N ame属性的不同大小。

尝试以下代码段:

console.log(typeof {}.doesNotExist);

它会显示为undefined

最后但同样重要的是:您可能从学习如何调试中获益更多,而不是这些答案:)可以通过在代码中的任何位置添加console.log调用来完成一些简单的调试。更好的是利用浏览器的调试或使用IDE进行调试。

答案 1 :(得分:1)

检查hasOwnProperty时,请在引号内使用firstName。此外,JavaScript是一种区分大小写的语言。 firstName和firstname被视为不同的变量。您在代码中使用 if(contacts [i] .firstname === prop),而实际上它应该是 if(contacts [i] .firstName === firstName)。并且,请比较正确的财产。你将firstName与道具进行比较,我不明白你真正想要做什么。

//Setup
var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];


function lookUpProfile(firstName, prop){
// Only change code below this line
  for (i = 0; i < contacts.length; i++) {

      if (contacts[i].hasOwnProperty('firstName')) {
        if (contacts[i].firstName === prop) {
          return contacts[i].firstName;
        }
        else {
          return "No such property";
        }
      }
      else {
        return "No such contact";
      }
  }
}

答案 2 :(得分:1)

试试这个会起作用:

function lookUpProfile(firstName, prop){
// Only change code below this line
  for (i = 0; i < contacts.length; i++) {

      if (contacts[i].hasOwnProperty(prop)) {
        if (contacts[i].firstName == firstName) {
          return contacts[i][prop];
        }
        else {
          return "No such contact";
        }
      }
      else {
        return "No such property";
      }
  }
// Only change code above this line
}

// Change these values to test your function
var data = lookUpProfile("Akira", "likes");
console.log(data);

工作小提琴:https://jsfiddle.net/yp8b2tg7/

所有要求均已满足:

  • 如果两者都为真,则返回&#34;值&#34;该财产。
  • 如果firstName与任何联系人不对应,则返回&#34;不这样 接触&#34;
  • 如果道具与任何有效的属性不对应,则返回&#34;否 这样的财产&#34;

答案 3 :(得分:0)

在大多数情况下,罗希特的回答是正确的。

如果我运行测试用例,

"No such contact"

它将返回

if (contacts[i].firstName == firstName) {}

这不是预期的结果。

问题出在

的'else'部分
function lookUpProfile(firstName, prop){
   for (i = 0; i < contacts.length; i++) {
      if (contacts[i].hasOwnProperty(prop)) {
         if (contacts[i].firstName == firstName) {
            return contacts[i][prop];
         }
      }
      else {
         return "No such property";
      }
   }
   return "No such contact";
}

var data = lookUpProfile("Sherlock", "likes");
console.log(data);

选中“联系人”中的第一项时,仅在找到匹配的联系人时才返回该值。否则忽略它并循环遍历“联系人”中的项目。一切都完成后,我们可以返回“没有这样的联系人”

我已经修改了下面的功能 - 试试这个,

<configSections>
   <sectionGroup name="Fruits">
      <section name="Colors" />
   </sectionGroup>
</configSections>

<Fruits>
   <add key="apple" value="red" />
   <add key="banana" value="yellow" />
</Fruits>

更新了JSFiddle - Knowing when AJAX has loaded in UIWebView

答案 4 :(得分:0)

最好首先检查房产,如Rohit的答案。如果您想首先检查名称,可以试试这个,虽然不那么优雅:

function lookUpProfile(name, prop){
var count = 0;
for (i=0; i <contacts.length; i++) {
 if (contacts[i].firstName == name) {
   if (contacts[i].hasOwnProperty(prop)) {
     return contacts[i][prop];
   }
   else {
     return "No such property";
   }
 } else {
   count += 1;
 } 
}
if (count == contacts.length) {
  return "No such contact";
 }
}

答案 5 :(得分:0)

function lookUpProfile(firstName, prop){      
    var i, found=0;
    for (i = 0; i < contacts.length; i++)  {
        if (contacts[i].firstName == firstName) {
            found=1;
            if (contacts[i].hasOwnProperty(prop)) {
                return contacts[i][prop];
            } else {
                return "No such property";
            }
        }
    }
    return "No such contact"; //return this if contact not found
}