object-deep-search
Version:
Search through object properties recursevly with a complex filter.
97 lines (82 loc) • 2.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var find = exports.find = function find(object, filter, options) {
var result = [];
if (matchObject(object, filter)) {
result.push(object);
return result;
}
if (Array.isArray(object)) {
object.forEach(function (item) {
if (matchObject(item, filter)) {
result.push(item);
} else {
result.push.apply(result, _toConsumableArray(find(item, filter, options)));
}
});
} else if (isObject(object)) {
Object.keys(object).forEach(function (key) {
var item = object[key];
if (matchObject(item, filter)) {
result.push(item);
} else {
result.push.apply(result, _toConsumableArray(find(item, filter, options)));
}
});
}
return result;
};
var findFirst = exports.findFirst = function findFirst(object, filter, options) {
var result = void 0;
if (matchObject(object, filter)) {
return object;
}
if (Array.isArray(object)) {
object.every(function (item) {
if (matchObject(item, filter)) {
result = item;
return false;
} else {
result = findFirst(item, filter, options);
return result === undefined;
}
});
} else if (isObject(object)) {
Object.keys(object).every(function (key) {
var item = object[key];
if (matchObject(item, filter)) {
result = item;
return false;
} else {
result = findFirst(item, filter, options);
return result === undefined;
}
});
}
return result;
};
var matchObject = function matchObject(object, needle) {
if (typeof needle === 'function') {
return needle(object);
}
if (Array.isArray(needle) && Array.isArray(object)) {
return needle.every(function (item) {
return object.find(function (objectItem) {
return matchObject(objectItem, item);
}) !== undefined;
});
}
if (isObject(needle) && isObject(object) && !Array.isArray(object)) {
return Object.keys(needle).every(function (property) {
return object.hasOwnProperty(property) && matchObject(object[property], needle[property]);
});
}
return object === needle;
};
var isObject = function isObject(value) {
return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value;
};