Есть ли более хороший / умный способ фильтрации в JavaScript, чем добавление множества громоздких дополнений? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть массив из около 30 объектов. Некоторые объекты ведут себя по-разному, поэтому в моем тесте мне нужно отфильтровать их.

В настоящее время я делаю что-то вроде этого:

myArray.filter(item => item.name !== 'something' && item.name !== 'somethingElse' && item.name !== 'a third thing')

Это утомительно, безобразно и подвержено ошибкам. Могу ли я сделать это немного лучше?

Во-вторых, для моего второго теста я хотел бы проверить эти предметы. Можно ли отменить этот фильтр, чтобы он включал только эти элементы? В настоящее время я должен сделать чрезвычайно трудоемким:

myArray.filter(item => item.name === 'something' && item.name === 'somethingElse' && item.name === 'a third thing')

что не хорошо. Есть идеи?

Ответы [ 4 ]

2 голосов
/ 12 апреля 2019

Вы можете сохранить все имена элементов, которые вы хотите отфильтровать в массиве, а затем отфильтровать на основе этого массива?

const filteredItemNames = ['something', 'somethingElse', 'a third thing'];
const filteredItems = myArray.filter(item => !filteredItemNames.includes(item.name));

То, что вы могли бы затем легко изменить, выполнив

const filteredItems = myArray.filter(item => filteredItemNames.includes(item.name));
1 голос
/ 12 апреля 2019

Вы можете просто использовать метод Array.include () :

const desiredObjectNames = ['something', 'somethingElse', 'a third thing'];
myArray.filter(obj => desiredObjectNames.includes(obj);

или наоборот

myArray.filter(obj => !desiredObjectNames.includes(obj);
0 голосов
/ 12 апреля 2019

Вы можете создать массив, в который вы поместите все имена, которые должны быть отклонены / приняты

var reject = [
'something',
'somethingElse',
'a third thing'
]

var accept= [
'something',
'somethingElse',
'a third thing'
]

// reject if in array
myArray.filter(item => reject.indexOf(item) === -1)

// just accept if in array
myArray.filter(item => accept.indexOf(item) >= 0)
0 голосов
/ 12 апреля 2019

Из этого

myArray.filter(item =>
    item.name !== 'something' &&
    item.name !== 'somethingElse' &&
    item.name !== 'a third thing'
);

инверсия осуществляется с помощью законов Де Моргана

myArray.filter(item =>
    item.name === 'something' ||
    item.name === 'somethingElse' ||
    item.name === 'a third thing'
);

Последний может быть записан с помощью Set,

var items = new Set(['something', 'somethingElse', 'a third thing'],
    filtered = myArray.filter(({ name }) => items.has(name));

, а также первый с

var items = new Set(['something', 'somethingElse', 'a third thing'],
    filtered = myArray.filter(({ name }) => !items.has(name));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...