phpjs
Version:
69 lines (63 loc) • 1.9 kB
JavaScript
function array_slice(arr, offst, lgth, preserve_keys) {
// discuss at: http://phpjs.org/functions/array_slice/
// original by: Brett Zamir (http://brett-zamir.me)
// depends on: is_int
// input by: Brett Zamir (http://brett-zamir.me)
// bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// note: Relies on is_int because !isNaN accepts floats
// example 1: array_slice(["a", "b", "c", "d", "e"], 2, -1);
// returns 1: {0: 'c', 1: 'd'}
// example 2: array_slice(["a", "b", "c", "d", "e"], 2, -1, true);
// returns 2: {2: 'c', 3: 'd'}
/*
if ('callee' in arr && 'length' in arr) {
arr = Array.prototype.slice.call(arr);
}
*/
var key = '';
if (Object.prototype.toString.call(arr) !== '[object Array]' ||
(preserve_keys && offst !== 0)) { // Assoc. array as input or if required as output
var lgt = 0,
newAssoc = {};
for (key in arr) {
//if (key !== 'length') {
lgt += 1;
newAssoc[key] = arr[key];
//}
}
arr = newAssoc;
offst = (offst < 0) ? lgt + offst : offst;
lgth = lgth === undefined ? lgt : (lgth < 0) ? lgt + lgth - offst : lgth;
var assoc = {};
var start = false,
it = -1,
arrlgth = 0,
no_pk_idx = 0;
for (key in arr) {
++it;
if (arrlgth >= lgth) {
break;
}
if (it == offst) {
start = true;
}
if (!start) {
continue;
}++arrlgth;
if (this.is_int(key) && !preserve_keys) {
assoc[no_pk_idx++] = arr[key];
} else {
assoc[key] = arr[key];
}
}
//assoc.length = arrlgth; // Make as array-like object (though length will not be dynamic)
return assoc;
}
if (lgth === undefined) {
return arr.slice(offst);
} else if (lgth >= 0) {
return arr.slice(offst, offst + lgth);
} else {
return arr.slice(offst, lgth);
}
}