Множество фильтров Javascript - PullRequest
0 голосов
/ 21 сентября 2018

Мой вопрос является расширением этого вопроса массив фильтров javascript несколько условий
из этого вопроса, если объект фильтра

{address: 'England', name: 'Mark'};

и массив

var users = [{
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];

, поэтому ответ

[
  {
    "name": "Mark",
    "email": "mark@mail.com",
    "age": 28,
    "address": "England"
  }
]

, что совершенно нормально, но мой вопрос - массив должен быть отфильтрован для значения свойств объекта фильтра
дляпример мой объект фильтра будет {address: 'England', name: ''} теперь это должно фильтровать массив для all names and address England

Ответы [ 5 ]

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

Если я правильно понимаю ваш вопрос, вам нужен следующий вывод.Если это то, что вы ищете Array.filter должно быть достаточно для вашего варианта использования.Взгляните на песочницу с кодом , где я создал функцию filterByObj, которая принимает аргументы arr, filterObj и возвращает данные для {address: "England", name: ""}

enter image description here

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

Вы можете использовать комбинацию filter и every с некоторой троичной логикой, чтобы определить, является ли значение фильтра пустым, чтобы получить все.

var users = [{
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];

var filter1 = {address: 'England', name: 'Mark'};
var filter2 = {address: 'England', name: ''};

function findResults(input, filterObj){
   return input.filter(
      item => Object.keys(filterObj)
                    .every(r => filterObj[r].length 
                                   ? item[r] == filterObj[r] 
                                   : true)
   )
}

console.log('with address and name', findResults(users,filter1));
console.log('with address only', findResults(users,filter2));
0 голосов
/ 21 сентября 2018

Вы нуждаетесь в filter для этого случая.

var filter1 = {
  address: 'England',
  name: 'Mark'
};

var filter2 = {
  address: 'England',
  name: ''
};

var users = [
  {
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];

function filterUser(arr, obj) {
  return arr.filter(function(item) {
    return (
      (obj.address === '' || item.address === obj.address) &&
      (obj.name === '' || item.name === obj.name)
    );
  });
}

console.log(filterUser(users, filter1));
console.log(filterUser(users, filter2));
0 голосов
/ 21 сентября 2018

Из примера в сообщении, которое вы упоминаете, просто продолжайте, если фильтр пуст

var filter = {address: 'England', name: ''}
var users = [{
    name: 'John',
    email: 'johnson@mail.com',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];

users = users.filter(function(item) {
  for (var key in filter) {
    if (filter[key] == "") continue; // added this:
    if (item[key] === undefined || item[key] != filter[key])
      return false;
  }
  return true;
});
console.log(users)
0 голосов
/ 21 сентября 2018

Вы будете использовать фильтр для пользователей и каждый для записей объекта фильтра

const filter = {address: 'England', name: 'Mark'};

const res = users.filter(user => 
  Object.entries(filter)
  .every(([k,v]) => v === '' || user[k] === v)
);
console.log(res);
<script>
var users = [{
  name: 'John',
  email: 'johnson@mail.com',
  age: 25,
  address: 'USA'
},
  {
    name: 'Tom',
    email: 'tom@mail.com',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: 'mark@mail.com',
    age: 28,
    address: 'England'
  }
];
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...