簡體   English   中英

使用javascript在對象中搜索數組而不使用循環

[英]Search through array in an object using javascript without using a loop

我想找到比使用2次迭代在對象中查找值更好,更優雅的解決方案。 我查看了在一個數組中搜索的函數,例如find,indexOf,但我想知道我可以在不使用for或forEach的情況下搜索對象。

假設我想找到所有游泳運動員。 到目前為止我得到了什么。

members = [
  { name: "Sue", hobby: ["Swimming", "Running", "Dancing"] },
  { name: "Sam", hobby: ["Cars", "Travelling"] },
  { name: "John", hobby: ["Reading", "Swimming"] },
  { name: "Rob", hobby: ["Running", "Coding"] },      
];
function findSwimmers(members, hobby) {      
  let swimmers = [];      
  members.forEach(function (e){        
    e.hobby.forEach(function (element){          
      if (element.toLowerCase() === hobby.toLowerCase()) {
        swimmers.push(e);
      }
    });
  });
  return swimmers;
}

您可以使用filter結合some通過傳遞回調函數作為參數。

 let members = [ { name: "Sue", hobby: ["Swimming", "Running", "Dancing"] }, { name: "Sam", hobby: ["Cars", "Travelling"] }, { name: "John", hobby: ["Reading", "Swimming"] }, { name: "Rob", hobby: ["Running", "Coding"] }, ]; function findSwimmers(members, hobby) { return members_swimming = members.filter(({hobby}) => hobby.some(item => item == "Swimming")); } console.log(findSwimmers(members, "Swimming")); 

您可以使用Array.filter()Array.map()進行解構:

 var members = [ { name: "Sue", hobby: ["Swimming", "Running", "Dancing"] }, { name: "Sam", hobby: ["Cars", "Travelling"] }, { name: "John", hobby: ["Reading", "Swimming"] }, { name: "Rob", hobby: ["Running", "Coding"] }, ]; var swimmers = members.filter(({hobby}) => hobby.includes('Swimming')).map(({name}) => name); console.log(swimmers) 

任何解決方案都將涉及循環。 唯一的問題是循環是在您的代碼中還是在您調用的函數中。

在您的情況下, filtersome似乎是使用的工具:

function findSwimmers(members, hobby) {
  hobby = hobby.toLowerCase();
  return members.filter(member =>
    member.hobby.some(h => h.toLowerCase() === hobby)
  );
}

您可能需要不同的函數名稱。 :-)

實例:

 const members = [ { name: "Sue", hobby: ["Swimming", "Running", "Dancing"] }, { name: "Sam", hobby: ["Cars", "Travelling"] }, { name: "John", hobby: ["Reading", "Swimming"] }, { name: "Rob", hobby: ["Running", "Coding"] }, ]; function findSwimmers(members, hobby) { hobby = hobby.toLowerCase(); return members.filter(member => member.hobby.some(h => h.toLowerCase() === hobby) ); } console.log(findSwimmers(members, "swimming")); 
 .as-console-wrapper { max-height: 100% !important; } 

請注意,原始代碼在找到愛好匹配時沒有停止循環(並且如果愛好數組中有重復的條目,則會多次添加相同的成員 - 但可能並不意味着重復數組)。

您也可以使用String#localeCompare (如果可用)和sensitivity: "base"選項,而不是比較小寫字符串。

您可以通過一行實現此目的:

let swimmers = members.filter(person => person.hobby.includes('Swimming'));

第一個解決方案:一點點黑客 但嘿,沒有循環

of less iterations) because ( MDN ): 第二個解決方案:使用Array.findIndex可以減少內部循環中的迭代次數(好吧,至少可以給出一些迭代次數較少的 )因為( MDN ):

...如果找到這樣的元素,findIndex會立即返回該迭代的索引...

 const findMembersWithValueForKey = (members, key, value) => members.filter(member => member[key] instanceof Array && `#${member[key].join("#")}#`.toLowerCase() .indexOf(`#${value.toLowerCase()}#`) > -1 || false); const findMembersWithValueForKey2 = (members, key, value) => { value = value.toLowerCase(); return members.filter(member => member[key] instanceof Array && member[key].findIndex(v => v.toLowerCase() === value) > -1 || false); }; const members = [ { name: "Sue", hobby: ["Swimming", "Running", "Dancing"] }, { name: "Sam", hobby: ["Cars", "Travelling"] }, { name: "John", hobby: ["Reading", "Swimming"] }, { name: "Rob", hobby: ["Running", "Coding"] }, ]; console.log(findMembersWithValueForKey(members, "hobby", "swimming")); console.log(findMembersWithValueForKey2(members, "hobby", "swimming")); 

暫無
暫無

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

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