Фильтровать массив объектов JSON по нескольким значениям или аргументам javascript - PullRequest
0 голосов
/ 25 сентября 2018
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.

Ответы [ 4 ]

0 голосов
/ 25 сентября 2018

Вы можете написать это следующим образом.Если вы хотите выполнить точный поиск, напишите функцию поиска, подобную этой:

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'))
0 голосов
/ 25 сентября 2018

Почему бы не 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);
0 голосов
/ 25 сентября 2018

не может ли это быть просто функцией цикла for?// вызвать this.filterIt ('имя пользователя', 'Алиса', пользователи);

//function
Function filterIt (key, value, arr){
result = [];
for ( a in arr){
   if (a[key] == value) result.push(a);
}
return result;
}
0 голосов
/ 25 сентября 2018

Вы можете использовать .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" }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...