UNPKG

phpjs

Version:

php.js offers community built php functions in javascript

179 lines (162 loc) 5.99 kB
--- layout: page title: "JavaScript array_splice function" comments: true sharing: true footer: true alias: - /functions/view/array_splice:338 - /functions/view/array_splice - /functions/view/338 - /functions/array_splice:338 - /functions/338 --- <!-- Generated by Rakefile:build --> A JavaScript equivalent of PHP's array_splice {% codeblock array/array_splice.js lang:js https://raw.github.com/kvz/phpjs/master/functions/array/array_splice.js raw on github %} function array_splice (arr, offst, lgth, replacement) { // From: http://phpjs.org/functions // + original by: Brett Zamir (http://brett-zamir.me) // + input by: Theriault // % note 1: Order does get shifted in associative array input with numeric indices, // % note 1: since PHP behavior doesn't preserve keys, but I understand order is // % note 1: not reliable anyways // % note 2: Note also that IE retains information about property position even // % note 2: after being supposedly deleted, so use of this function may produce // % note 2: unexpected results in IE if you later attempt to add back properties // % note 2: with the same keys that had been deleted // - depends on: is_int // * example 1: input = {4: "red", 'abc': "green", 2: "blue", 'dud': "yellow"}; // * example 1: array_splice(input, 2); // * returns 1: {0: "blue", 'dud': "yellow"} // * results 1: input == {'abc':"green", 0:"red"} // * example 2: input = ["red", "green", "blue", "yellow"]; // * example 2: array_splice(input, 3, 0, "purple"); // * returns 2: [] // * results 2: input == ["red", "green", "blue", "purple", "yellow"] // * example 3: input = ["red", "green", "blue", "yellow"] // * example 3: array_splice(input, -1, 1, ["black", "maroon"]); // * returns 3: ["yellow"] // * results 3: input == ["red", "green", "blue", "black", "maroon"] var _checkToUpIndices = function (arr, ct, key) { // Deal with situation, e.g., if encounter index 4 and try to set it to 0, but 0 exists later in loop (need to // increment all subsequent (skipping current key, since we need its value below) until find unused) if (arr[ct] !== undefined) { var tmp = ct; ct += 1; if (ct === key) { ct += 1; } ct = _checkToUpIndices(arr, ct, key); arr[ct] = arr[tmp]; delete arr[tmp]; } return ct; }; if (replacement && typeof replacement !== 'object') { replacement = [replacement]; } if (lgth === undefined) { lgth = offst >= 0 ? arr.length - offst : -offst; } else if (lgth < 0) { lgth = (offst >= 0 ? arr.length - offst : -offst) + lgth; } if (Object.prototype.toString.call(arr) !== '[object Array]') { /*if (arr.length !== undefined) { // Deal with array-like objects as input delete arr.length; }*/ var lgt = 0, ct = -1, rmvd = [], rmvdObj = {}, repl_ct = -1, int_ct = -1; var returnArr = true, rmvd_ct = 0, rmvd_lgth = 0, key = ''; // rmvdObj.length = 0; for (key in arr) { // Can do arr.__count__ in some browsers lgt += 1; } offst = (offst >= 0) ? offst : lgt + offst; for (key in arr) { ct += 1; if (ct < offst) { if (this.is_int(key)) { int_ct += 1; if (parseInt(key, 10) === int_ct) { // Key is already numbered ok, so don't need to change key for value continue; } _checkToUpIndices(arr, int_ct, key); // Deal with situation, e.g., // if encounter index 4 and try to set it to 0, but 0 exists later in loop arr[int_ct] = arr[key]; delete arr[key]; } continue; } if (returnArr && this.is_int(key)) { rmvd.push(arr[key]); rmvdObj[rmvd_ct++] = arr[key]; // PHP starts over here too } else { rmvdObj[key] = arr[key]; returnArr = false; } rmvd_lgth += 1; // rmvdObj.length += 1; if (replacement && replacement[++repl_ct]) { arr[key] = replacement[repl_ct]; } else { delete arr[key]; } } // arr.length = lgt - rmvd_lgth + (replacement ? replacement.length : 0); // Make (back) into an array-like object return returnArr ? rmvd : rmvdObj; } if (replacement) { replacement.unshift(offst, lgth); return Array.prototype.splice.apply(arr, replacement); } return arr.splice(offst, lgth); } {% endcodeblock %} - [Raw function on GitHub](https://github.com/kvz/phpjs/blob/master/functions/array/array_splice.js) Please note that php.js uses JavaScript objects as substitutes for PHP arrays, they are the closest match to this hashtable-like data structure. Please also note that php.js offers community built functions and goes by the [McDonald's Theory](https://medium.com/what-i-learned-building/9216e1c9da7d). We'll put online functions that are far from perfect, in the hopes to spark better contributions. Do you have one? Then please just: - [Edit on GitHub](https://github.com/kvz/phpjs/edit/master/functions/array/array_splice.js) ### Example 1 This code {% codeblock lang:js example %} input = {4: "red", 'abc': "green", 2: "blue", 'dud': "yellow"}; array_splice(input, 2); {% endcodeblock %} Should return {% codeblock lang:js returns %} {0: "blue", 'dud': "yellow"} {% endcodeblock %} ### Example 2 This code {% codeblock lang:js example %} input = ["red", "green", "blue", "yellow"]; array_splice(input, 3, 0, "purple"); {% endcodeblock %} Should return {% codeblock lang:js returns %} [] {% endcodeblock %} ### Example 3 This code {% codeblock lang:js example %} input = ["red", "green", "blue", "yellow"] array_splice(input, -1, 1, ["black", "maroon"]); {% endcodeblock %} Should return {% codeblock lang:js returns %} ["yellow"] {% endcodeblock %} ### Other PHP functions in the array extension {% render_partial _includes/custom/array.html %}