【问题标题】:Searching array of objects not returning desired result搜索对象数组未返回所需结果
【发布时间】:2014-10-03 03:12:31
【问题描述】:

我正在处理我的一个项目,我有这个联系人列表contacts,这是一个包含objectsarray

问题是我的函数searchPerson 总是返回搜索到的人不存在的条件的响应。 一旦我删除条件并再次调用该函数,它就会返回搜索的内容。

我不明白为什么在联系人列表中存在该人时它总是返回no such person found!!谁能帮我理解为什么会这样?

这是我的代码。

var bob = {
firstName: "Bob",
lastName: "Jones",
phoneNumber: "(650) 777-7777",
email: "bob.jones@example.com"
};

var mary = {
    firstName: "Mary",
    lastName: "Johnson",
    phoneNumber: "(650) 888-8888",
    email: "mary.johnson@example.com"
};

//Here we populate ou array.
var contacts = [bob, mary];

function printPerson(person) {
    console.log(person.firstName + " " + person.lastName);
}


function searchPerson (lastName) {
    var contactsLength = contacts.length;
    for(var i = 0; i < contactsLength; i++){
      //set a condition that we only retrieve the last name if it already exists in out contact list
        if(lastName !== contacts[i].lastName){
            return console.log("No such person found!");
        } else {
            printPerson(contacts[i]);
        }
    }
}

【问题讨论】:

  • @RobG 恕我直言,如果没有强制 == 运算符,JS 将是一种更好的语言。

标签: javascript arrays function javascript-objects


【解决方案1】:

您正在枚举整个数组,但只要找到 any 个不匹配的人,就会返回“No such person found”。由于两个姓氏不相同,您将总是触发return 行。

考虑使用Array.prototype.filter 来查找匹配条目:

function searchPerson(lastName) {
    var matches = contacts.filter(function(contact) {
        return contact.lastName === lastName;
    });

    if (matches.length) {
        matches.forEach(printPerson);
    } else {
        console.log("No such person found!");
    }
}

注意:.filter.forEach 是 ES5 函数(IE9+ 仅限 AFAICR)。如果需要,使用"shim" 将它们添加到您的浏览器。

【讨论】:

  • filter 不是短路的,所以效率不是很高,但对于一些记录来说应该没关系。
  • @plalx 确实-我认为-使用Array.prototype.any 进行单纯的存在性测试会更快,但这也不会打印匹配项,它只是证明了它的存在。您可以将对printPerson 的调用放在.any 函数的回调中,但这有点混乱。无论如何,OP 的代码 出现 旨在打印每个匹配项,因此不需要短路。
  • @plalx 是 - .some,不是 .any! (我脑子里的语言太多了!)
  • @Alnitak 谢谢!我现在知道了!一旦您解释了问题,我只需将console.log("No such person found"); 替换为continue;,它也可以正常工作。
【解决方案2】:

您需要修复逻辑,以便为找到的每个匹配项打印名称。如果没有找到匹配项,则返回错误。

function searchPerson (lastName) {
    var contactsLength = contacts.length;

    // Remember if a match is found
    var matchFound = false;

    for (var i = 0; i < contactsLength; i++) {

        // Print each match
        if (lastName == contacts[i].lastName) {
            printPerson(contacts[i]);
            matchFound = true;
        }
    }

    // If no match found, return error message
    if (!matchFound) {
        console.log('Person ' + lastName + ' not found!');
    }
}

【讨论】:

  • @Alnitak——欢迎你提出这个意见。对我来说,纯 JS 解决方案更简单,hugely faster——大约是 10 倍——并且不需要填充程序或对使用的任何浏览器进行特殊考虑。
  • ES5 纯JS!你是对的,虽然函数调用开销可能有点高。看看更大的数组会如何变化会很有趣。
猜你喜欢
  • 2019-12-05
  • 2020-05-18
  • 1970-01-01
  • 2011-02-08
  • 2020-08-30
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多