循环遍历javascript对象

时间:2016-03-21 23:54:42

标签: javascript

如何访问javascript对象的属性,如下所示? 如果可能,请解释每一步。

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 lookUp(firstName, prop){

     //code here

 }

我希望能够访问联系人的姓名。例如,

                      lookUp("Akira", "likes") 

应该给我这个名字和喜欢的名字。并且                            lookUp(“画了”,“喜欢”) 应该给我回来                             “没有这样的联系”。

提前多多感谢!

2 个答案:

答案 0 :(得分:3)

它是一个对象数组,因此您搜索数组以查找.firstName属性与所需名称匹配的对象。

然后,您会看到相同的匹配对象是否具有传递了其他名称的属性,例如"likes"

function lookUp(fname, prop) {
    for (var i = 0; i < contacts.length; i++) {
        if (contacts[i].firstName === fname) {
            return contacts[i][prop];
        }
    }
    return null;
}

lookUp("Akira", "likes");   // returns ["Pizza", "Coding", "Brownie Points"]
lookUp("Drew", "like");     // returns null (because name doesn't exist)
lookup("Akira", "address"); // returns undefined (because property doesn't exist)

如果传入的prop参数不作为匹配对象的属性存在,则返回undefined。如果未找到firstName作为匹配项,则返回null。如果你想要一个不同的返回值,那么你可以在返回之前测试返回值,并在缺少属性时将返回结果更改为你想要的任何值。或者,您可以让调用者测试返回值并相应地执行操作(这是如何编写的)。

如果你真的想在财产缺失时返回"No such property",而在找不到联系人时"No such contact",则可以这样做:

function lookUp(fname, prop) {
    for (var i = 0; i < contacts.length; i++) {
        if (contacts[i].firstName === fname) {
            return contacts[i][prop] || "No such property";
        }
    }
    return "No such Contact";
}

但是,请注意,在一个案例中返回一个数组并在另一个时间返回一个字符串是非常不寻常的。您正在强制调用者测试返回值的类型,以便知道如何正确使用它。这在Javascript编程中并不常见。

答案 1 :(得分:0)

您有两种选择。其中一个是for循环遍历联系人列表,但如果您希望在功能上执行此操作,也可以使用Array.prototype.find。这样做是循环遍历数组,直到给出的回调满足正确的条件。比使用for循环更容易辨认,但性能并不完全相同。

ES5

// Callback for the next function
function lookup(firstName, prop) {
    var tarContact = contacts.find(function (contact) {
        return contact.name === firstName;
    });

    return tarContact && tarContact[prop];
});

function lookup(firstName, prop) {
    for (var i = 0; i < contacts.length; i++) {
        var contact = contacts[i];
        if (contact.name === firstName) {
            return contact && contact[prop];
        }
    }

    return;
}

ES6

const lookup = (firstName, prop) => {
    let tarContact = contacts.find((contact) => contact.name === firstName);
    return tarContact && tarContact[prop];
}

const lookup = (firstName, prop) => {
    for (let contact of contacts) {
        if (contact.name === firstName) {
            return contact && contact[prop];
        }
    }

    return;
}