在多个值或参数 javascript 上过滤 JSON 对象数组


users = [
{
"username": "Alice",
"firstName": "Alice-U",
"lastName": "Wonderland"
},
{
"username": "bob",
"firstName": "Bob-u",
"lastName": "Builder",
},
{
"username": "charly",
"firstName": "Charly-u",
"lastName": "Brown",
}
]

我希望能够根据多个值过滤此数组,例如:

搜索条件:{ "username" : "Alice" }应返回:

{
"username": "Alice",
"firstName": "Alice-U",
"lastName": "Wonderland"
}

类似:{ "username" : "charly", "firstName": "Charly-u" }应该返回:

{
"username": "charly",
"firstName": "Charly-u",
"lastName": "Brown",
}

使用javaScript或jQuery进行精确字符串匹配。

您可以使用.every来检查每个条件键是否匹配:

function filterBy(list, criteria) {
return list.filter(candidate =>
Object.keys(criteria).every(key =>
candidate[key] == criteria[key]
)
);
}
let users = [
{ "username": "Alice", "firstName": "Alice-U", "lastName": "Wonderland" },
{ "username": "bob", "firstName": "Bob-u", "lastName": "Builder" },
{ "username": "charly", "firstName": "Charly-u", "lastName": "Brown" }
];
console.log(filterBy(users, { "username" : "Alice" }));
console.log(filterBy(users, { "username" : "charly", "firstName": "Charly-u" }));

为什么不是 Array.prototype.filter((? 以仅过滤具有username="Alice"的元素。顺便说一下,您可以在过滤对象数组时在过滤器的箭头函数中添加多个对象键。例如:

user.username ==='Charly' && firstName==='Charly-u'

users = [{
"username": "Alice",
"firstName": "Alice-U",
"lastName": "Wonderland"
},
{
"username": "bob",
"firstName": "Bob-u",
"lastName": "Builder",
},
{
"username": "charly",
"firstName": "Charly-u",
"lastName": "Brown",
}
];
result = users.filter(user => user.username ==='Alice');
console.log(result);

它不能只是一个带有for循环的函数吗? 叫 this.filterIt( 'username' , 'Alice', users(;

//function
Function filterIt (key, value, arr){
result = [];
for ( a in arr){
if (a[key] == value) result.push(a);
}
return result;
}

您可以按以下方式编写它。如果你想做精确搜索,写一个这样的搜索函数:

function search(term) {
return users.filter(({username, firstName, lastName}) => {
return username.toLowerCase() === term.toLowerCase() ||
firstName.toLowerCase() === term.toLowerCase() ||
lastName.toLowerCase() === term.toLowerCase()
})
}

无需比较每个键,可以使用object.keys迭代所有对象属性。

如果要匹配每个内容,请使用以下功能

function search(term) {
return users.filter(({username, firstName, lastName}) => {
return username.toLowerCase().indexOf(term.toLowerCase()) > -1 ||
firstName.toLowerCase().indexOf(term.toLowerCase()) > -1 ||
lastName.toLowerCase().indexOf(term.toLowerCase()) > -1
})
}

这甚至可以在任何地方searchTerm匹配。就像你把它用作search('al').它将返回第一个对象,而第一个函数需要像search('alice')这样的字符串才能工作。

const users = [{
"username": "Alice",
"firstName": "Alice-U",
"lastName": "Wonderland"
},
{
"username": "bob",
"firstName": "Bob-u",
"lastName": "Builder",
},
{
"username": "charly",
"firstName": "Charly-u",
"lastName": "Brown",
}
]
function searchFull(term) {
return users.filter(({
username,
firstName,
lastName
}) => {
return username.toLowerCase() === term.toLowerCase() ||
firstName.toLowerCase() === term.toLowerCase() ||
lastName.toLowerCase() === term.toLowerCase()
})
}
function search(term) {
return users.filter(({
username,
firstName,
lastName
}) => {
return username.toLowerCase().indexOf(term.toLowerCase()) > -1 ||
firstName.toLowerCase().indexOf(term.toLowerCase()) > -1 ||
lastName.toLowerCase().indexOf(term.toLowerCase()) > -1
})
}
console.log(searchFull('alice'))
console.log(search('al'))

最新更新