Фильтровать объекты в массиве по парам ключ-значение - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть массив объектов, таких как:

    [
      {
        id: 'a',
        name: 'Alan',
        age: 10
      },
      {
        id: 'ab'
        name: 'alanis',
        age: 15
      },
      {
        id: 'b',
        name: 'Alex',
        age: 13
      }
    ]

Мне нужно передать объект, подобный этому { id: 'a', name: 'al' }, чтобы он выполнял подстановочный фильтр и возвращал массив с первыми двумя объектами.

Итак, шаги:

  1. Для каждого объекта в массиве отфильтруйте соответствующие ключи из данного объекта фильтра

  2. Для каждого ключа проверьте, начинается ли значение с соответствующего значения ключа объекта фильтра

В настоящее время я использую функцию фильтра lodash, чтобы она выполняла точное совпадение, но не начиналас / подстановочный тип соответствия.Вот что я делаю:

filter(arrayOfObjects, filterObject)

Ответы [ 4 ]

1 голос
/ 03 апреля 2019

Я думаю ты ищешь что-то подобное?По сути, будет выполнять сопоставление string.include со значением каждого ключа в объекте фильтра. Если одно из значений ключа совпадает, оно будет включено в результат.Если вы хотите, чтобы весь объект фильтра соответствовал, вы можете сделать .every вместо .some ...

const data = [
  {
    id: 'a',
    name: 'Alan',
    age: 10
  },
  {
    id: 'ab',
    name: 'alanis',
    age: 15
  },
  {
    id: 'b',
    name: 'Alex',
    age: 13
  }
]

const filter = { id: 'a', name: 'al' }

function filterByObject(filterObject, data) {
  const matched = data.filter(object => {
    return Object.entries(filterObject).some(([filterKey, filterValue]) => {
      return object[filterKey].includes(filterValue)
    })
  })
  return matched
}

console.log(filterByObject(filter, data))
1 голос
/ 03 апреля 2019

Если я правильно понимаю ваш вопрос, начинается с - это ключевой термин, который вы ищете?

const arr = [
{
  id: 'a',
  name: 'Alan',
  age: 10
},
{
  id: 'ab',
  name: 'alanis',
  age: 15
},
{
  id: 'b',
  name: 'Alex',
  age: 13
}
];

const searchTerm = { id: 'a', name: 'al' }
const result = arr.filter(x => 
                x.id === searchTerm.id || 
                x.name.startsWith(searchTerm.name)
              );
              
console.log(result)
0 голосов
/ 03 апреля 2019

Для фильтра динамических объектов.Вы можете closure и reduce

const data = [
  {id: 'a',name: 'Alan',age: 10},
  {id: 'ab',name: 'alanis',age: 15},
  {id: 'b',name: 'Alex',age: 13}
]

const queryObj = { id: 'a', name: 'al' }
const queryObj2 = { name: 'al', age: 13 }

const filterWith = obj => e => { 
  return Object.entries(obj).reduce((acc, [key, val]) => {
    if(typeof val === 'string') return acc || e[key].startsWith(val)
    else return acc || e[key] === val
  }, false)
}

const filter1 = filterWith(queryObj)
const filter2 = filterWith(queryObj2)

console.log(data.filter(filter1))
console.log(data.filter(filter2))
0 голосов
/ 03 апреля 2019

Вы можете создать собственный метод, который получает и обрабатывает объекты с парами (key, regular expression) и внутри итератора Array.filter () над Object.entries () , чтобы проверить наличиенекоторые совпадения.

let input = [
  {id: 'a', name: 'Alan', age: 10},
  {id: 'ab', name: 'alanis', age: 15},
  {id: 'b', name: 'Alex', age: 13}
];

const filterWithSome = (arr, obj) =>
{
    return arr.filter(o =>
    {
        return Object.entries(obj).some(([k, v]) => o[k].match(v));
    });
}

console.log(filterWithSome(input, {id: /^a/, name: /^al/}));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Если вместо этого вы хотите сопоставить каждый (key, regular expression) объекта, переданного в качестве аргумента, вы можете заменить Array.some () by Array.every () :

let input = [
  {id: 'a', name: 'Alan', age: 10},
  {id: 'ab', name: 'alanis', age: 15},
  {id: 'b', name: 'Alex', age: 13}
];

const filterWithEvery = (arr, obj) =>
{
    return arr.filter(o =>
    {
        return Object.entries(obj).every(([k, v]) => o[k].match(v));
    });
}

console.log(filterWithEvery(input, {id: /^ab/, name: /^al/}));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
...