foop
Version:
interfaces that describe their intentions.
54 lines (50 loc) • 4.96 kB
JavaScript
var ObjectKeys = require('../util/keys')
var lengthMinusOne = require('../util/lengthMinusOne')
var isArray = require('../is/array')
var isObj = require('../is/objNotNull')
var isString = require('../is/stringPrimitive')
/**
* @desc get last index in a list
* @since 5.0.0-beta.2
* @memberOf fp
*
* @name lastIndex
* @alias findLastIndex
*
* @param {Array | Object | string | *} x item to find the last index of
* @return {number|string|*} last index, usually number/string
*
* @tests fp/last
*
* @TODO could have support for map...
* @NOTE works for strings too eh
* @extends deps/util/keysObjOrArray
*
* {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L667 underscore-last-index}
* {@link https://github.com/lodash/lodash/tree/npm-packages/lodash.findlastindex lodash-find-last-index}
* {@link https://github.com/ramda/ramda/tree/v0.24.1/src/findLastIndex.js ramda-find-last-index}
* @see {@link ramda-find-last-index}
* @see {@link lodash-find-last-index}
* @see {@link underscore-last-index}
* @see deps/fp/last
*
* @example
*
* lastIndex([0, 'one']) //=> 1
* lastIndex({one: 1, two: 2}) //=> 'two'
*
*/
function lastIndex(x) {
if (isString(x) || isArray(x)) { return lengthMinusOne(x) }
else if (isObj(x)) { return ObjectKeys(x).pop() }
else { return -1 }
// @TODO if (isString(x)) return x.lastIndexOf()
// else if (isObj(x)) return toNumber(lengthMinusOne(keys(x)))
// else if (isObj(x)) return lastIndex(ObjectKeys(x))
// const xKeys = isArray(x) ? x : keys(x)
// return xKeys[lengthMinusOne(xKeys)]
// const last = xKeys[xKeys.length - 1]
// return last
}
module.exports = lastIndex
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFzdEluZGV4LmpzIiwic291cmNlcyI6WyJsYXN0SW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL3V0aWwva2V5cycpXG5jb25zdCBsZW5ndGhNaW51c09uZSA9IHJlcXVpcmUoJy4uL3V0aWwvbGVuZ3RoTWludXNPbmUnKVxuY29uc3QgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2lzL2FycmF5JylcbmNvbnN0IGlzT2JqID0gcmVxdWlyZSgnLi4vaXMvb2JqTm90TnVsbCcpXG5jb25zdCBpc1N0cmluZyA9IHJlcXVpcmUoJy4uL2lzL3N0cmluZ1ByaW1pdGl2ZScpXG5cbi8qKlxuICogQGRlc2MgZ2V0IGxhc3QgaW5kZXggaW4gYSBsaXN0XG4gKiBAc2luY2UgNS4wLjAtYmV0YS4yXG4gKiBAbWVtYmVyT2YgZnBcbiAqXG4gKiBAbmFtZSBsYXN0SW5kZXhcbiAqIEBhbGlhcyBmaW5kTGFzdEluZGV4XG4gKlxuICogQHBhcmFtICB7QXJyYXkgfCBPYmplY3QgfCBzdHJpbmcgfCAqfSB4IGl0ZW0gdG8gZmluZCB0aGUgbGFzdCBpbmRleCBvZlxuICogQHJldHVybiB7bnVtYmVyfHN0cmluZ3wqfSBsYXN0IGluZGV4LCB1c3VhbGx5IG51bWJlci9zdHJpbmdcbiAqXG4gKiBAdGVzdHMgZnAvbGFzdFxuICpcbiAqIEBUT0RPIGNvdWxkIGhhdmUgc3VwcG9ydCBmb3IgbWFwLi4uXG4gKiBATk9URSB3b3JrcyBmb3Igc3RyaW5ncyB0b28gZWhcbiAqIEBleHRlbmRzIGRlcHMvdXRpbC9rZXlzT2JqT3JBcnJheVxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvYmxvYi9tYXN0ZXIvdW5kZXJzY29yZS5qcyNMNjY3IHVuZGVyc2NvcmUtbGFzdC1pbmRleH1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC90cmVlL25wbS1wYWNrYWdlcy9sb2Rhc2guZmluZGxhc3RpbmRleCBsb2Rhc2gtZmluZC1sYXN0LWluZGV4fVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9yYW1kYS9yYW1kYS90cmVlL3YwLjI0LjEvc3JjL2ZpbmRMYXN0SW5kZXguanMgcmFtZGEtZmluZC1sYXN0LWluZGV4fVxuICogQHNlZSB7QGxpbmsgcmFtZGEtZmluZC1sYXN0LWluZGV4fVxuICogQHNlZSB7QGxpbmsgbG9kYXNoLWZpbmQtbGFzdC1pbmRleH1cbiAqIEBzZWUge0BsaW5rIHVuZGVyc2NvcmUtbGFzdC1pbmRleH1cbiAqIEBzZWUgZGVwcy9mcC9sYXN0XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGxhc3RJbmRleChbMCwgJ29uZSddKSAgICAgICAvLz0+IDFcbiAqICAgbGFzdEluZGV4KHtvbmU6IDEsIHR3bzogMn0pIC8vPT4gJ3R3bydcbiAqXG4gKi9cbmZ1bmN0aW9uIGxhc3RJbmRleCh4KSB7XG4gIGlmIChpc1N0cmluZyh4KSB8fCBpc0FycmF5KHgpKSByZXR1cm4gbGVuZ3RoTWludXNPbmUoeClcbiAgZWxzZSBpZiAoaXNPYmooeCkpIHJldHVybiBPYmplY3RLZXlzKHgpLnBvcCgpXG4gIGVsc2UgcmV0dXJuIC0xXG5cbiAgLy8gQFRPRE8gaWYgKGlzU3RyaW5nKHgpKSByZXR1cm4geC5sYXN0SW5kZXhPZigpXG4gIC8vIGVsc2UgaWYgKGlzT2JqKHgpKSByZXR1cm4gdG9OdW1iZXIobGVuZ3RoTWludXNPbmUoa2V5cyh4KSkpXG4gIC8vIGVsc2UgaWYgKGlzT2JqKHgpKSByZXR1cm4gbGFzdEluZGV4KE9iamVjdEtleXMoeCkpXG4gIC8vIGNvbnN0IHhLZXlzID0gaXNBcnJheSh4KSA/IHggOiBrZXlzKHgpXG4gIC8vIHJldHVybiB4S2V5c1tsZW5ndGhNaW51c09uZSh4S2V5cyldXG4gIC8vIGNvbnN0IGxhc3QgPSB4S2V5c1t4S2V5cy5sZW5ndGggLSAxXVxuICAvLyByZXR1cm4gbGFzdFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxhc3RJbmRleFxuIl0sIm5hbWVzIjpbImNvbnN0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQzFDQSxHQUFLLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztBQUN4REEsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3RDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUN6Q0EsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlDakQsU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFO0VBQ3BCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFBLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFBO09BQ2xELElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUEsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUE7T0FDeEMsRUFBQSxPQUFPLENBQUMsQ0FBQyxFQUFBOzs7Ozs7Ozs7Q0FTZjs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVM7In0=