'use strict';
function falsyValue(item) {
if (Array.isArray(item)) {
if (item.length) {
return false;
}
} else if (item !== undefined && item !== null
&& typeof item === 'object') {
if (Object.keys(item).length) {
return false;
}
} else if (item) {
return false;
}
return true;
}
function filterObject(func, items) {
const result = {};
Object.keys(items).forEach((key) => {
if (func) {
if (func(items[key], key)) {
result[key] = items[key];
}
} else if (!falsyValue(items[key])) {
result[key] = items[key];
}
});
return result;
}
function filterArray(func, items) {
if (func) {
return items.filter(func);
}
const result = [];
for (let i = 0; i < items.length; i += 1) {
const item = items[i];
if (!falsyValue(item)) {
result.push(item);
}
}
return result;
}
module.exports = function filter(fn) {
const func = fn || false;
let filteredItems = null;
if (Array.isArray(this.items)) {
filteredItems = filterArray(func, this.items);
} else {
filteredItems = filterObject(func, this.items);
}
return new this.constructor(filteredItems);
};
|