var _ = require('../util') var Path = require('../parsers/path') /** * Filter filter for v-repeat * * @param {String} searchKey * @param {String} [delimiter] * @param {String} dataKey */ exports.filterBy = function (arr, search, delimiter, dataKey) { // allow optional `in` delimiter // because why not if (delimiter && delimiter !== 'in') { dataKey = delimiter } if (search == null) { return arr } // cast to lowercase string search = ('' + search).toLowerCase() return arr.filter(function (item) { return dataKey ? contains(Path.get(item, dataKey), search) : contains(item, search) }) } /** * Filter filter for v-repeat * * @param {String} sortKey * @param {String} reverse */ exports.orderBy = function (arr, sortKey, reverse) { if (!sortKey) { return arr } var order = 1 if (arguments.length > 2) { if (reverse === '-1') { order = -1 } else { order = reverse ? -1 : 1 } } // sort on a copy to avoid mutating original array return arr.slice().sort(function (a, b) { if (sortKey !== '$key' && sortKey !== '$value') { if (a && '$value' in a) a = a.$value if (b && '$value' in b) b = b.$value } a = _.isObject(a) ? Path.get(a, sortKey) : a b = _.isObject(b) ? Path.get(b, sortKey) : b return a === b ? 0 : a > b ? order : -order }) } /** * String contain helper * * @param {*} val * @param {String} search */ function contains (val, search) { if (_.isPlainObject(val)) { for (var key in val) { if (contains(val[key], search)) { return true } } } else if (_.isArray(val)) { var i = val.length while (i--) { if (contains(val[i], search)) { return true } } } else if (val != null) { return val.toString().toLowerCase().indexOf(search) > -1 } }