Сравнение массивов и объектов для системы фильтров? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть два объекта / массива, которые мне нужно сравнить для системы фильтров, вот грубый набор данных:

var books = [{
        'title': 'book a',
        'relatedIds': [1, 2],
        'authorId': 1,
    },{
        'title': 'book b',
        'relatedIds': [1, 2, 3, 4],
        'authorId': 2,
    },{
        'title': 'book a',
        'relatedIds': [1],
        'authorId': 3,
    }];

var filters = {
    'relatedIds' : [1, 2, 3],
    'author': [1, 2]
};

Что я ожидаю увидеть для приведенных выше фильтров, которые book a (имеетсвязанные идентификаторы 1 и 2 и идентификатор автора 1 из фильтра) и book b (имеет связанные идентификаторы 1, 2 и 3 и идентификатор автора 2 из фильтра).

Я бы не ожидал увидеть book c дажехотя он имеет правильный связанный идентификатор, его автор - 3, которого нет в фильтре.

Я пытался использовать метод фильтра lodash:

_.filter(books, (book) => { 
    ....

Но я не вижукак я могу сделать сравнение на основе массивов из фильтра или массива или int / string в книгах.

Ответы [ 2 ]

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

Используйте _.intesection(), чтобы найти похожие элементы в relatedIds, проверив длину результата (0, если нет похожих элементов). Используйте _.includes(), чтобы проверить, есть ли authorId в массиве фильтров author:

const books = [{"title":"book a","relatedIds":[1,2],"authorId":1},{"title":"book b","relatedIds":[1,2,3,4],"authorId":2},{"title":"book a","relatedIds":[1],"authorId":3}];

const filters = {"relatedIds":[1,2,3],"author":[1,2]};

const result = _.filter(books, o =>
  _.intersection(o.relatedIds, filters.relatedIds).length &&
  _.includes(filters.author, o.authorId)
);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
1 голос
/ 04 апреля 2019

Вы можете использовать фильтр , некоторые и , включая

  • filter используется для получения только желаемого результата из исходных данных
  • some используется проверить любой элемент relatedId доступен в filters relativeId или нет
  • includes используется для проверки, доступно ли данное значение в массиве.

var books = [{'title': 'book a','relatedIds': [1, 2],'authorId': 1,},{'title': 'book b','relatedIds': [1, 2, 3, 4],'authorId': 2,},{'title': 'book a','relatedIds': [1],'authorId': 3,}];

var filters = {
    'relatedIds' : [1, 2, 3],
    'author': [1, 2]
};

let op = books.filter(({relatedIds,authorId})=>(
   relatedIds.some(id=> filters.relatedIds.includes(id))
   && filters.author.includes(authorId)
))
console.log(op)
...