From 0efdd41e4b5572f05d15e7811480dc71323a1d77 Mon Sep 17 00:00:00 2001 From: Argie Bacani Date: Fri, 23 Oct 2020 21:19:37 +0800 Subject: [PATCH 1/2] Update array-prototype-move.js [refactor] Reduced the move function to a few lines of code. [feat] Add a new moveElement function to move elements if name is known. [feat] Add a new swap function to swap indices. --- src/array-prototype-move.js | 38 ++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/array-prototype-move.js b/src/array-prototype-move.js index 45a9199..230337c 100644 --- a/src/array-prototype-move.js +++ b/src/array-prototype-move.js @@ -5,19 +5,35 @@ if ( this.length === 0 ) { return this; } - while (old_index < 0) { - old_index += this.length; - } - while (new_index < 0) { - new_index += this.length; + + this.splice(new_index, 0, this.splice(this[old_index - 1], 1)[0]); + + return this; // for testing purposes + }; + } + + if(!Array.prototype.moveElement) { + Array.prototype.moveElement = function (element, new_index) { + if ( this.length === 0 ) { + return this; } - if (new_index >= this.length) { - var k = new_index - this.length; - while ((k--) + 1) { - this.push(undefined); - } + + this.splice(new_index, 0, this.splice(this.indexOf(element), 1)[0]); + + return this; // for testing purposes + }; + } + + if(!Array.prototype.swap) { + Array.prototype.swap = function (toSwapIndex, swapToIndex) { + if ( this.length === 0 ) { + return this; } - this.splice(new_index, 0, this.splice(old_index, 1)[0]); + + var temp = this[swapToIndex]; + this[swapToIndex] = this[toSwapIndex]; + this[toSwapIndex] = temp; + return this; // for testing purposes }; } From 312fbf37f56c6faf102ad622cfd1a0c30acb09a5 Mon Sep 17 00:00:00 2001 From: Hydrokat Date: Sun, 25 Oct 2020 14:34:59 +0800 Subject: [PATCH 2/2] [feat] Object move can now be done with name:value [test] Added tests --- package-lock.json | 341 ++++++++++++++++++++++++++++++++++++ src/array-prototype-move.js | 27 ++- tests/testMoveElement.js | 48 +++++ tests/testSwap.js | 52 ++++++ 4 files changed, 465 insertions(+), 3 deletions(-) create mode 100644 package-lock.json create mode 100644 tests/testMoveElement.js create mode 100644 tests/testSwap.js diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2761122 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,341 @@ +{ + "name": "array.prototype.move", + "version": "0.0.4", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "deep-equal": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.1.2.tgz", + "integrity": "sha1-skbCuApXCkfBG+HZvRBw7IeLh84=", + "dev": true + }, + "defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", + "dev": true + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "faucet": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/faucet/-/faucet-0.0.1.tgz", + "integrity": "sha1-WX3PHSGJosBiMhtZHo8VHtIDnZw=", + "dev": true, + "requires": { + "defined": "0.0.0", + "duplexer": "~0.1.1", + "minimist": "0.0.5", + "sprintf": "~0.1.3", + "tap-parser": "~0.4.0", + "tape": "~2.3.2", + "through2": "~0.2.3" + } + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "minimist": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz", + "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "dev": true, + "requires": { + "through": "~2.3.4" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "sprintf": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz", + "integrity": "sha1-j4PjmpMXwaUCy324BQ5Rxnn27c8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + }, + "tap-parser": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-0.4.3.tgz", + "integrity": "sha1-pOrhkMENdsehEZIf84u+TVjwnuo=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.11" + } + }, + "tape": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tape/-/tape-2.3.3.tgz", + "integrity": "sha1-Lnzgox3wn41oUWZKcYQuDKUFevc=", + "dev": true, + "requires": { + "deep-equal": "~0.1.0", + "defined": "~0.0.0", + "inherits": "~2.0.1", + "jsonify": "~0.0.0", + "resumer": "~0.0.0", + "through": "~2.3.4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + } + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } +} diff --git a/src/array-prototype-move.js b/src/array-prototype-move.js index 230337c..2eb25c4 100644 --- a/src/array-prototype-move.js +++ b/src/array-prototype-move.js @@ -5,8 +5,12 @@ if ( this.length === 0 ) { return this; } - - this.splice(new_index, 0, this.splice(this[old_index - 1], 1)[0]); + + if (new_index < 0) { + new_index = this.length - 1; + } + + this.splice(new_index, 0, this.splice(old_index, 1)[0]); return this; // for testing purposes }; @@ -18,7 +22,20 @@ return this; } - this.splice(new_index, 0, this.splice(this.indexOf(element), 1)[0]); + if(new_index < 0) { + new_index = this.length - 1; + } + + var splitElement = element.split(":"); + if(Array.isArray(splitElement) && splitElement.length > 1) { + var elementIndex = this.findIndex((row) => { + return row[splitElement[0]] == splitElement[1]; + }); + + this.splice(new_index, 0, this.splice(elementIndex, 1)[0]); + } else { + this.splice(new_index, 0, this.splice(this.indexOf(element), 1)[0]); + } return this; // for testing purposes }; @@ -29,6 +46,10 @@ if ( this.length === 0 ) { return this; } + + if (swapToIndex < 0) { + swapToIndex = this.length - 1; + } var temp = this[swapToIndex]; this[swapToIndex] = this[toSwapIndex]; diff --git a/tests/testMoveElement.js b/tests/testMoveElement.js new file mode 100644 index 0000000..9a76e89 --- /dev/null +++ b/tests/testMoveElement.js @@ -0,0 +1,48 @@ +var chai = require("chai"); +var expect = chai.expect; + +require("../src/array-prototype-move.js"); + +var simpleArray = ["Han Solo", "Luke Skywalker", "Obi-Wan Kenobi", "Darth Vader", "Chewbacca", "C3P0", "R2D2"]; + + +describe("[Move Element] Simple array tests", function() { + it("should move the robots to the front of the array", function() { + simpleArray.moveElement("Han Solo", 3); + simpleArray.moveElement("Darth Vader", 1); + expect(simpleArray[3] === "Han Solo" && simpleArray[1] === "Darth Vader").to.be.true; + }); + + it("should move Chewie to the end, via a negative number", function() { + simpleArray.moveElement("Chewbacca", -1); + expect(simpleArray[6] === "Chewbacca").to.be.true; + }); +}); + + +var objectArray = [{ name: "Han Solo", weapon: "blaster" }, { name: "Luke Skywalker", weapon: "lightsabre" }, { name: "Obi-Wan Kenobi", weapon: "lightsabre" }, { name: "Darth Vader", weapon: "lightsabre" }, { name: "Chewbacca", weapon: "bowcaster" }, { name: "C3P0" }, { name: "R2D2" }]; + + +describe("[Move Element] Object array tests", function() { + it("should move the Han and R2 to the front of the array", function() { + objectArray.moveElement("name:Han Solo", 0); + objectArray.moveElement("name:R2D2", 1); + expect(objectArray[1].name === "R2D2" && objectArray[0].name === "Han Solo").to.be.true; + }); + + it("should move Luke to the end, still with his sabre, via a negative number", function() { + objectArray.moveElement("name:Luke Skywalker", -1); + expect(objectArray[6].name === "Luke Skywalker" && objectArray[6].weapon === "lightsabre").to.be.true; + }); +}); + +var emptyArray = []; +describe("[Move Element] Moving within an empty array", function() { + it("should return the same (empty) array for a negative new number move", function() { + emptyArray.moveElement(1, -1); + expect(emptyArray).to.be.empty; + }); +}); + + + diff --git a/tests/testSwap.js b/tests/testSwap.js new file mode 100644 index 0000000..ef6fbf3 --- /dev/null +++ b/tests/testSwap.js @@ -0,0 +1,52 @@ +var chai = require("chai"); +var expect = chai.expect; + +require("../src/array-prototype-move.js"); + +var simpleArray = ["Han Solo", "Luke Skywalker", "Obi-Wan Kenobi", "Darth Vader", "Chewbacca", "C3P0", "R2D2"]; + + +describe("[Swap] Simple array tests", function() { + it("should move the robots to the front of the array. Swapped with Han and Luke.", function() { + simpleArray.swap(5, 0); + simpleArray.swap(6, 1); + expect(simpleArray[0] === "C3P0" && simpleArray[1] === "R2D2").to.be.true; + expect(simpleArray[5] === "Han Solo" && simpleArray[6] === "Luke Skywalker").to.be.true; + }); + + it("should move Han to the end, via a negative number. Swapped with Luke", function() { + simpleArray.swap(5, -1); + expect(simpleArray[6] === "Han Solo").to.be.true; + expect(simpleArray[5] === "Luke Skywalker").to.be.true; + }); +}); + + +var objectArray = [{ name: "Han Solo", weapon: "blaster" }, { name: "Luke Skywalker", weapon: "lightsabre" }, { name: "Obi-Wan Kenobi", weapon: "lightsabre" }, { name: "Darth Vader", weapon: "lightsabre" }, { name: "Chewbacca", weapon: "bowcaster" }, { name: "C3P0" }, { name: "R2D2" }]; + + +describe("[Swap] Object array tests", function() { + it("should move the robots to the front of the array", function() { + objectArray.swap(5, 0); + objectArray.swap(6, 1); + expect(objectArray[0].name === "C3P0" && objectArray[1].name === "R2D2").to.be.true; + expect(objectArray[5].name === "Han Solo" && objectArray[6].name === "Luke Skywalker").to.be.true; + }); + + it("should move Han to the end, still with his blaster, via a negative number", function() { + objectArray.swap(5, -1); + expect(objectArray[6].name === "Han Solo" && objectArray[6].weapon === "blaster").to.be.true; + expect(objectArray[5].name === "Luke Skywalker" && objectArray[5].weapon === "lightsabre").to.be.true; + }); +}); + +var emptyArray = []; +describe("[Swap] Moving within an empty array", function() { + it("should return the same (empty) array for a negative new number move", function() { + emptyArray.swap(1, -1); + expect(emptyArray).to.be.empty; + }); +}); + + +