describe('Testing filterArray()', () => { it('should filter an array of objects by custom predicates', () => { const products = [ { name: 'A', color: 'Blue', size: 50, locations: ['USA', 'Europe'], details: { length: 20, width: 70 } }, { name: 'B', color: 'Blue', size: 60, locations: [], details: { length: 20, width: 70 } }, { name: 'C', color: 'Black', size: 70, locations: ['Japan'], details: { length: 20, width: 71 } }, { name: 'D', color: 'Green', size: 50, locations: ['USA'], details: { length: 20, width: 71 } }, ]; const filters = { size: size => size === 50 || size === 70, color: color => ['blue', 'black'].includes(color.toLowerCase()), locations: locations => locations.find(x => ['JAPAN', 'USA'].includes(x.toUpperCase())), details: details => details.length < 30 && details.width >= 70, }; const filtered = filterArray(products, filters); const expected = [ { name: 'A', color: 'Blue', size: 50, locations: ['USA', 'Europe'], details: { length: 20, width: 70 } }, { name: 'C', color: 'Black', size: 70, locations: ['Japan'], details: { length: 20, width: 71 } }, ]; expect(filtered).toStrictEqual(expected); }); });