[英]loop through json array and add to each object using 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)
任何解決方案都將涉及循環。 唯一的問題是循環是在您的代碼中還是在您調用的函數中。
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.