Фильтровать массив JSON по значениям, включенным в два массива (javascript) - PullRequest
0 голосов
/ 23 сентября 2018

Я пишу функцию фильтра массива JSON на основе нескольких критериев.
Фильтр зависит от двух массивов: 1. Первый содержит значения, которые должны быть частью искомого JSON, и 2. Второй содержит значения.которые являются необязательными.

Я имею в виду возвращать только те записи массива, которые содержат ВСЕ значения из массива obligatory и хотя бы один элемент из массива optional.

Вот моя попытка:

const searchKeys = ['varWord', 'varTrans', 'varSpec'],
  obligatory = ['trip', 'pret'],
  optional = ['greet', 'lco', 'toto', 'bene'];

function filterByUpdate(obligatory, optional, file) {
  return _.filter(file, item => {
    return _.some(optional, opt => {
      return _.every(obligatory, oblg => {
        return _.some(item, value => {
          return _.some(searchKeys, n => item[n].toLowerCase().includes(oblg.toLowerCase())) &&
            searchKeys.some(n => item[n].toLowerCase().includes(opt.toLowerCase()))
        })
      });
    });
  });
}

Приведенный выше код должен сохранять только первую запись из следующего массива данных:

[{
  "varSpec": "trip",
  "varTrans": "pret",
  "varWord": "greet",
  "stringPol": "group",
  "stringDva": "groupGend",
  "stringGit": "/tax",
}, {
  "varSpec": "trip",
  "varTrans": "pret",
  "varWord": "friend",
  "stringPol": "N",
  "stringDva": "N",
  "stringGit": "N",
}, {
  "varSpec": "group1",
  "varTrans": "grp1",
  "varWord": "ageGroup1",
  "stringPol": "N",
  "stringDva": "N",
  "stringGit": "N",
}]

1 Ответ

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

Вы можете пойти по этому довольно простому алгоритму:

const { flow, intersection, pick } = require('lodash/fp');

data.filter(
  flow(
    pick(searchKeys),
    entry => intersection(Object.values(entry)),
    intersectWith => intersectWith(obligatory).length === obligatory.length &&
                     intersectWith(optional).length >= 1
  )
);

Он сводится к проверке пересечения между, с одной стороны, соответствующими значениями (обозначенными searchKeys) в каждой записи вашего набора данных (data), а в другой:

  1. массив значений obligatory: пересечение должно иметь длину obligatory.length.
    то есть : содержит все элементы из коллекции obligatory
  2. optional массива значений: длина массива пересечения должна быть >= 1.
    т.е. : содержит не менее 1 элемента из коллекции optional

Вот ссылка на рабочий реплик .

...