Javascript 匹配数组中的值并从函数返回另一个数组

Javascript 匹配数组中的值并从函数返回另一个数组,javascript,Javascript,我的任务是创建一个基于对象的用户数组。然后创建一个函数,该函数接受一个参数并返回与第一个arr中比较的值匹配的另一个数组 var users = [ { firstname : "jetlag", lastname: "son" }, { firstname : "becky", lastname: "love" }, { firstname : "just", lastname: "me" } ]; function

我的任务是创建一个基于对象的用户数组。然后创建一个函数,该函数接受一个参数并返回与第一个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"));
var用户=[
{
名字:“时差”,
姓:“儿子”
},
{
名字:“贝基”,
姓:“爱”
},
{ 
名字:“刚刚”,
姓:“我”
}
];
函数匹配名(名称){
对于(var i=0;i
我可以匹配一个特定的用户名,但是如果我只是在
matchName(“j”)
中输入
j
,我想返回两个对象

这方面的任何帮助都会很好。


谢谢。

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

var users = [...];
function matchName(name) {
    return users.filter(function (user) {
        return user.firstname.indexOf(name) !== -1;
    });
}
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;
}

为此使用
Array.prototype.filter()
。您的方法将仅返回第一个匹配项作为对象

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

然后使用result的
length
来测试是否存在匹配项

,以便比较前缀,而不是相等项

你可以用

users[i].firstname.indexOf(name) === 0
测试
user.firstname
是否以
name
开头

和用于检索匹配项:

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

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

您当前的代码返回第一个完整的匹配。此代码:

  if(users[i].firstname == name) {
      return users[i];
  }
检查两个字符串是否相等,然后return语句将只返回匹配的值。函数返回任何值后也会停止

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

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

var users = [...];
function matchName(name) {
    return users.filter(function (user) {
        return user.firstname.indexOf(name) !== -1;
    });
}
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;
}
函数匹配名(名称){
var validUsers=[];//传递逻辑的用户数组
对于(var i=0;i
注意:根据您正在打印的文本,我通过检查
validUsers
数组中的元素数,移动了打印逻辑,即在循环外找不到任何用户。只有当没有匹配的用户时,才会打印一次

这里有一个

你可以用来匹配你名字的任何部分,而不仅仅是乞丐

function matchName(name) {
  var pattern = new RegEx(name, "i");
  for (var i = 0; i < users.length; i++) {
      if(users[i].firstname.search(pattern)) {
          return users[i];
      } else {
          console.log('user does not exist')
      }
  }
}
函数匹配名(名称){
var模式=新的正则表达式(名称“i”);
对于(var i=0;i
正则表达式?看起来很棒,我只是想打破它显示用户不存在错误后,它不会打印该语句三次。谢谢@Shivam根据控制台日志的文本进行更新。