foop
Version:
interfaces that describe their intentions.
75 lines (72 loc) • 6.7 kB
JavaScript
// const forOwn = require('../loop/each/forOwn')
var hasOwnProperty = require('../util/hasOwnProperty')
var isObj = require('../is/obj')
var curry = require('./curry')
/**
* Takes a spec object and a test object returns true if the test satisfies
* the spec. Each of the spec's own properties must be a predicate function.
* Each predicate is applied to the value of the corresponding property of the
* test object. `where` returns true if all the predicates return true, false
* otherwise.
*
* `where` is well suited to declaratively expressing constraints for other
* functions such as [`filter`](#filter) and [`find`](#find).
*
* @since 5.0.0-beta.6
* @memberOf fp
* @curried 2
*
* @param {Object} spec
* @param {Object} testObj
* @return {Boolean}
*
* @tests fp/where
*
* {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L323 underscore-where}
* {@link https://github.com/lodash/lodash/blob/master/.internal/baseConformsTo.js lodash-conformsto}
* {@link https://github.com/ramda/ramda/blob/v0.24.1/src/where.js ramda-where}
* @see {@link underscore-where}
* @see {@link ramda-where}
* @see {@link lodash-conformsto}
*
* @func
* @fork v0.1.1
* @category Object
* @sig {String: (* -> Boolean)} -> {String: *} -> Boolean
*
* @example
*
* // pred :: Object -> Boolean
* var pred = where({
* a: equals('foo'),
* b: not(equals('bar')),
* x: gt('_', 10),
* y: lt('_', 20)
* })
*
* pred({a: 'foo', b: 'xxx', x: 11, y: 19}) //=> true
* pred({a: 'xxx', b: 'xxx', x: 11, y: 19}) //=> false
* pred({a: 'foo', b: 'bar', x: 11, y: 19}) //=> false
* pred({a: 'foo', b: 'xxx', x: 10, y: 19}) //=> false
* pred({a: 'foo', b: 'xxx', x: 11, y: 20}) //=> false
*
*/
module.exports = curry(2, function where(spec, testObj) {
// forOwn(spec, (test, prop) => {
// hasOwnProperty(testObj, prop) && !spec[prop](testObj[prop])
// })
for (var prop in spec) {
if (hasOwnProperty(spec, prop)) {
if (isObj(spec[prop]) && hasOwnProperty(testObj, prop)) {
if (!where(spec[prop], testObj[prop])) {
return false
}
}
else if (!hasOwnProperty(testObj, prop) || !spec[prop](testObj[prop])) {
return false
}
}
}
return true
})
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUuanMiLCJzb3VyY2VzIjpbIndoZXJlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGNvbnN0IGZvck93biA9IHJlcXVpcmUoJy4uL2xvb3AvZWFjaC9mb3JPd24nKVxuY29uc3QgaGFzT3duUHJvcGVydHkgPSByZXF1aXJlKCcuLi91dGlsL2hhc093blByb3BlcnR5JylcbmNvbnN0IGlzT2JqID0gcmVxdWlyZSgnLi4vaXMvb2JqJylcbmNvbnN0IGN1cnJ5ID0gcmVxdWlyZSgnLi9jdXJyeScpXG5cbi8qKlxuICogVGFrZXMgYSBzcGVjIG9iamVjdCBhbmQgYSB0ZXN0IG9iamVjdCByZXR1cm5zIHRydWUgaWYgdGhlIHRlc3Qgc2F0aXNmaWVzXG4gKiB0aGUgc3BlYy4gRWFjaCBvZiB0aGUgc3BlYydzIG93biBwcm9wZXJ0aWVzIG11c3QgYmUgYSBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKiBFYWNoIHByZWRpY2F0ZSBpcyBhcHBsaWVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBvZiB0aGVcbiAqIHRlc3Qgb2JqZWN0LiBgd2hlcmVgIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIHByZWRpY2F0ZXMgcmV0dXJuIHRydWUsIGZhbHNlXG4gKiBvdGhlcndpc2UuXG4gKlxuICogYHdoZXJlYCBpcyB3ZWxsIHN1aXRlZCB0byBkZWNsYXJhdGl2ZWx5IGV4cHJlc3NpbmcgY29uc3RyYWludHMgZm9yIG90aGVyXG4gKiBmdW5jdGlvbnMgc3VjaCBhcyBbYGZpbHRlcmBdKCNmaWx0ZXIpIGFuZCBbYGZpbmRgXSgjZmluZCkuXG4gKlxuICogQHNpbmNlIDUuMC4wLWJldGEuNlxuICogQG1lbWJlck9mIGZwXG4gKiBAY3VycmllZCAyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNwZWNcbiAqIEBwYXJhbSB7T2JqZWN0fSB0ZXN0T2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICpcbiAqIEB0ZXN0cyBmcC93aGVyZVxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvYmxvYi9tYXN0ZXIvdW5kZXJzY29yZS5qcyNMMzIzIHVuZGVyc2NvcmUtd2hlcmV9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvLmludGVybmFsL2Jhc2VDb25mb3Jtc1RvLmpzIGxvZGFzaC1jb25mb3Jtc3RvfVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9yYW1kYS9yYW1kYS9ibG9iL3YwLjI0LjEvc3JjL3doZXJlLmpzIHJhbWRhLXdoZXJlfVxuICogQHNlZSB7QGxpbmsgdW5kZXJzY29yZS13aGVyZX1cbiAqIEBzZWUge0BsaW5rIHJhbWRhLXdoZXJlfVxuICogQHNlZSB7QGxpbmsgbG9kYXNoLWNvbmZvcm1zdG99XG4gKlxuICogQGZ1bmNcbiAqIEBmb3JrIHYwLjEuMVxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAoKiAtPiBCb29sZWFuKX0gLT4ge1N0cmluZzogKn0gLT4gQm9vbGVhblxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICAvLyBwcmVkIDo6IE9iamVjdCAtPiBCb29sZWFuXG4gKiAgICAgIHZhciBwcmVkID0gd2hlcmUoe1xuICogICAgICAgIGE6IGVxdWFscygnZm9vJyksXG4gKiAgICAgICAgYjogbm90KGVxdWFscygnYmFyJykpLFxuICogICAgICAgIHg6IGd0KCdfJywgMTApLFxuICogICAgICAgIHk6IGx0KCdfJywgMjApXG4gKiAgICAgIH0pXG4gKlxuICogICAgICBwcmVkKHthOiAnZm9vJywgYjogJ3h4eCcsIHg6IDExLCB5OiAxOX0pIC8vPT4gdHJ1ZVxuICogICAgICBwcmVkKHthOiAneHh4JywgYjogJ3h4eCcsIHg6IDExLCB5OiAxOX0pIC8vPT4gZmFsc2VcbiAqICAgICAgcHJlZCh7YTogJ2ZvbycsIGI6ICdiYXInLCB4OiAxMSwgeTogMTl9KSAvLz0+IGZhbHNlXG4gKiAgICAgIHByZWQoe2E6ICdmb28nLCBiOiAneHh4JywgeDogMTAsIHk6IDE5fSkgLy89PiBmYWxzZVxuICogICAgICBwcmVkKHthOiAnZm9vJywgYjogJ3h4eCcsIHg6IDExLCB5OiAyMH0pIC8vPT4gZmFsc2VcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY3VycnkoMiwgZnVuY3Rpb24gd2hlcmUoc3BlYywgdGVzdE9iaikge1xuICAvLyBmb3JPd24oc3BlYywgKHRlc3QsIHByb3ApID0+IHtcbiAgLy8gICBoYXNPd25Qcm9wZXJ0eSh0ZXN0T2JqLCBwcm9wKSAmJiAhc3BlY1twcm9wXSh0ZXN0T2JqW3Byb3BdKVxuICAvLyB9KVxuXG4gIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eShzcGVjLCBwcm9wKSkge1xuICAgICAgaWYgKGlzT2JqKHNwZWNbcHJvcF0pICYmIGhhc093blByb3BlcnR5KHRlc3RPYmosIHByb3ApKSB7XG4gICAgICAgIGlmICghd2hlcmUoc3BlY1twcm9wXSwgdGVzdE9ialtwcm9wXSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWhhc093blByb3BlcnR5KHRlc3RPYmosIHByb3ApIHx8ICFzcGVjW3Byb3BdKHRlc3RPYmpbcHJvcF0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufSlcbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQUEsR0FBSyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUM7QUFDeERBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNsQ0EsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtRGhDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFOzs7OztFQUt0RCxLQUFLQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtJQUNyQixJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7TUFDOUIsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtRQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtVQUNyQyxPQUFPLEtBQUs7U0FDYjtPQUNGO1dBQ0ksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDckUsT0FBTyxLQUFLO09BQ2I7S0FDRjtHQUNGO0VBQ0QsT0FBTyxJQUFJO0NBQ1osQ0FBQzsifQ==