匹配数组中的值并从函数

时间:2015-04-30 19:15:06

标签: javascript

我被赋予了创建基于对象的用户数组的任务。然后创建一个函数,该函数接收一个参数并返回另一个与第一个arr

中比较的值匹配的数组
var users = [
  {
    firstname : "jetlag",
    lastname: "son"
  },
  {
    firstname : "becky",
    lastname: "love"
  },
  { 
    firstname : "just",
    lastname: "me"
  }
];

function matchName(name) {
  for (var i = 0; i < users.length; i++) {
      if(users[i].firstname == name) {
          return users[i];
      } else {
          console.log('user does not exist')
      }
  }
}

console.log(matchName("jetlag"));

我能够匹配一个特定的用户名,但是如果我只是将j输入matchName("j"),我想返回两个对象。

对此的任何帮助都会很棒。 http://jsfiddle.net/dv9aq0m7/

感谢。

5 个答案:

答案 0 :(得分:2)

您可以使用Array.prototype.filter并返回符合条件的对象数组。像这样:

var users = [...];
function matchName(name) {
    return users.filter(function (user) {
        return user.firstname.indexOf(name) !== -1;
    });
}

答案 1 :(得分:2)

您当前的代码会返回第一个完整匹配项。这段代码:

ar = [int(i) for i in raw_input().strip().split()]

检查两个字符串是否等于,然后return语句只返回该匹配的值。一旦返回任何值,该函数也会停止。

所以你需要做两个小改动。首先,您需要跟踪符合条件的所有用户,并且您应该使用不同的逻辑来检查string starts with another string

修改后的代码可能如下所示:

  if(users[i].firstname == name) {
      return users[i];
  }

注意:根据您正在打印的文本,我通过检查function matchName(name) { var validUsers = []; //the array of users that pass the logic for (var i = 0; i < users.length; i++) { if(users[i].firstname.lastIndexOf(name) === 0) { //this is "starts with" logic validUsers.push(users[i]); //add the element if it's valid } } //I moved the logic for no matching users the outside the loop if (validUsers.length === 0) console.log('No matching users found') return validUsers; } 数组中的元素数量,移动了打印逻辑,表明在循环外没有找到用户。只有在没有匹配的用户时才会打印一次。

这里是fork to your fiddle

答案 2 :(得分:1)

所以你想要比较前缀,而不是相等。

您可以使用

users[i].firstname.indexOf(name) === 0

测试user.firstname是否以name开头。

使用filtering检索匹配项:

function matchName (name) {
    return users.filter(function (user) {
        return user.firstname.indexOf(name) === 0;
    });
}

这总是返回一个数组,我认为这是一个更好的界面。

答案 3 :(得分:0)

使用Array.prototype.filter()。您的方法只会将第一场比赛作为对象返回。

function matchName(name) {
    return users.filter(function (item) {
        return item.firstname == name
    }   
}

然后使用结果的length来测试匹配是否存在

答案 4 :(得分:0)

您可以使用regular expressions来匹配您姓名的任何部分,而不仅仅是开始。

width