UNPKG

object-deep-search

Version:

Search through object properties recursevly with a complex filter.

97 lines (82 loc) 2.83 kB
'use strict'; 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; };