簡體   English   中英

從數組匹配值並從函數返回另一個數組

[英]Match value from array and return another array from a 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"));

我可以匹配特定的用戶名,但是如果我在matchName("j")輸入jmatchName("j")我想返回兩個對象。

任何幫助都會很棒。 http://jsfiddle.net/dv9aq0m7/

謝謝。

您可以使用Array.prototype.filter並返回與您的條件匹配的對象數組。 像這樣:

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

您當前的代碼將返回第一個完全匹配項。 這段代碼:

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

檢查兩個字符串是否相等 ,然后return語句將僅返回該匹配值。 該函數返回任何值后也將停止。

因此,您需要進行兩個小更改。 首先,您需要跟蹤所有符合條件的用戶,並且應該使用不同的邏輯來檢查該字符串是否以另一個string開頭

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

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;
}

注意:根據您要打印的文本,我通過檢查validUsers數組中的元素數,將打印邏輯移到了循環外找不到任何用戶的validUsers 僅當沒有匹配的用戶時,才打印一次。

這是一把撥弄你的小提琴

因此,您想比較前綴而不是相等性。

您可以使用

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

測試如果user.firstname打頭name

並使用過濾來檢索匹配項:

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

這總是返回一個數組,我認為這是一個更好的接口。

為此使用Array.prototype.filter() 您的方法只會將第一個匹配項作為對象返回。

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

然后使用結果的length來測試是否存在匹配項

您可以使用正則表達式來匹配名稱的任何部分,而不僅僅是開頭。

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')
      }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM