ytech-js-extensions
Simple js extensions for Array, String, Date, Math and Object
Features
- Lightweight
- ES5 support
- Available importing of each function (not only prototype assignments which are used by default)
Installing
Using npm:
npm install ytech-js-extensions
Example
Using with default import
import "ytech-js-extensions"; //ES6 way for import
// Remove item from array
var arr = [{ id: 1 }, { id: 2 }, { id: 3 }];
var removedItem = arr.remove(function (item) {
return item.id == 2;
});
console.log(arr, removedItem);
// Compare dates without time
var date1 = new Date(2018, 1, 1, 12, 23, 16);
var date2 = new Date(2018, 1, 1, 12, 24, 19);
console.log(Date.compareByDate(date1, date2));
// Compare strings with ignoring case
var str1 = "test";
var str2 = "tEsT";
console.log(str1.equal(str2));
Using with partial import
import arrayRemove from "ytech-js-extensions/lib/array/remove";
// Remove item from array
var arr = [{ id: 11 }, { id: 12 }, { id: 13 }];
var removedItem = arrayRemove.call(arr, function (item) {
return item.id == 12;
});
console.log(arr, removedItem);
Array
- instance
- .last() ⇒
any - last item from array (undefined if array is empty)
- .addIfNotExists(item: any, null | String | predicate) ⇒
executed item: any - add item if it doesn't exist. The second argument => Null - for primitives, string - search by name, function - predicate like in a .filter()
- .remove(item: any | predicate: function) ⇒
executed item: any - remove item by predicate for searching or by item (for direct comparing)
- .last() ⇒
- static
- .concatNotNull(...arrays: [] | null) ⇒
new Array - concatinate arrays exlcuding null-arrays => Array.concatNotNull([1,2], null)
- .concatNotNull(...arrays: [] | null) ⇒
String
- instance
- .equal(value: String) ⇒
Boolean - compare with ignoring case
- .fromCamelCase() ⇒
new String - transform from camelCase: 'myCamelCaseString' to 'My Camel Case String'
- .toCamelCase() ⇒
new String - split string by spaces and join to camelCase: 'My camel Case string' to 'myCamelCaseString'
- .toLowerCaseFirst() ⇒
new String - set to lower case first char
- .toUpperCaseFirst() ⇒
new String - set to upper case first char
- .equal(value: String) ⇒
Date
- instance
- .equal(value: Date) ⇒
Boolean - compare by values
- .equalDates(value: Date) ⇒
Boolean - compare without time-values
- .addDays(value: Number) ⇒
Date
- .addMonths(value: Number) ⇒
Date
- .addYears(value: Number) ⇒
Date
- .resetTime() ⇒
Date
- .resetUTCTime() ⇒
Date
- .equal(value: Date) ⇒
- static
- .tryParseJSON(value: String) ⇒
new Date or same String - try parse Date from String-Date-ISO-Format
- .compareByDate(v1: Date, v2: Date) ⇒
-1, 0 or 1 - compare without time-value for sort functions
- .UTCFromValues(year: Number, month: Number, date: Number) ⇒
new Date - create UTC date
- .UTCFromDate(Date) ⇒
new Date - create UTC date
- .tryParseJSON(value: String) ⇒
Math
- Math .randomInt(min?: Number, max?: Number) ⇒
Int - generate random int between values
Math.Convert
- Math.Convert .kmToMiles(km: Number) ⇒
Float - convert kilometers to miles
- Math.Convert .milesToKm(miles: Number) ⇒
Float - convert miles to kilometers
- Math.Convert .degToRad(value: Number) ⇒
Float - convert degrees to radians
Math.Coord
- Math.Coord .distanceBetween(lat1: Number, lng1: Number, lat2: Number, lng2: Number) ⇒
Kilometers: Number - distance between 2 coordinates
- Math.Coord .addToLat(lat: Number, km: Number) ⇒
Latitude: Float - add distance to latitude
- Math.Coord .addToLng(lng: Number, lat: Number, km: Number) ⇒
Longitude: Float - add distance to longitude
Object
- Object .equal(v1: any, v2: any, options?: EqualOptions) ⇒
Boolean - recursively compare 2 values with ignoring null and by setted EqaulOptions
- Object .tryParseJSONDate(obj: any) ⇒
the same object: any - recursively find string values and trying parse to Date by Date.tryParseJSON(str)
- Object .removeNulls(obj: String|Array|Object, options?: RemoveOptions) ⇒
the same object: any - remove null, undefined, ''(empty-string) properties by setted options
Object.equal
Compare 2 objects by properties (with using EqualOptions)
import "ytech-js-extensions"; //ES6 way for import
import EqualOptions from "ytech-js-extensions/object/equal/equalOptions.js";
// Compare equals
var v1 = { nested: { id: 1 }, arr: ["s", "d"], dt: new Date() };
var v2 = {
nested: { id: 1 },
arr: ["s", "d"],
dt: new Date(),
fnc: function () {},
};
console.log(Object.equal(v1, v2)); //expected true
//Compare with options
var options = new EqualOptions();
options.ignoreEmptyArrays = true;
options.ignoreFunctions = false; //here we setted ignoreFunctions to false
options.checkKeysLength = false;
options.showFalseReason = true; //or function(message, v1, v2, key) { bla-bla; return message}
console.log(Object.equal(v1, v2, options), options.falseReason); //expected false and falseReason as string message
EqualOptions
Param | Type | Default | Description |
---|---|---|---|
checkKeysLength | Boolean | false | true => restrict comparing by properties: equal({}, {v:null}) === false. True will ignore ignoreFunctions and ignoreEmptyArrays if Object.keys.length are different |
ignoreEmptyArrays | Boolean | true | true => equal({}, {arr:[]}) === true |
ignoreFunctions | Boolean | true | true => equal({fnc:function(){return 's'} }, {fnc:function(){return 'b'} }) === true |
showFalseReason | Boolean or Function(msg,v1,v2,key) | false | true if we need to add to options.falseReason message if equal is false function if we need to use own report-logic |
falseReason | String - output | | will be added message if showFalseReason != true and equal is false |
Object.removeNulls
Remove null properties (values) from String, Array or Object (with using RemoveOptions)
import "ytech-js-extensions"; //ES6 way for import
import RemoveOptions from "ytech-js-extensions/object/remove/removeOptions.js";
// Remove without default options
var v = {
id: 1,
arr: [1, null, 2],
arr2: [null, " ", undefined],
arr3: [],
s: " ",
s2: " str ",
};
console.log(Object.removeNulls(v)); //expected { id: 1, arr: [1, 2], s2: 'str' }
//Remove with options
var options = new RemoveOptions();
options.removeEmptyArrays = true;
options.removeNullsFromArrays = false;
options.trimStrings = false; //use 's'.trim()
options.removeEmptyStrings = true;
var v = {
id: 1,
arr: [1, null, 2],
arr2: [null, " ", undefined],
arr3: [],
s: " ",
s2: " str ",
};
console.log(Object.removeNulls(v, options)); //expected { id: 1, arr: [1, 2], s2: 'str' }
RemoveOptions
Param | Type | Default | Description |
---|---|---|---|
removeEmptyArrays | Boolean | true | true => remove arrays with length === 0 |
removeNullsFromArrays | Boolean | true | true => [1, null, 2] filter to [1, 2] |
trimStrings | Boolean | true | true => use the default string.trim() |
removeEmptyStrings | Boolean | true | true => remove properties, values which has string value == '' |
Troubleshooting
Some packages (like html2canvas, pdfjs) can stop working if you have prototype extensions of default types (Array, String, Object etc.). In this case we can
- include in project only specific functions instead of prototype-assign - see Example OR
temporarily remove extensions and assign again later
// removing prototype extensions otherwise it doesn't work with pdfjs const arrProto = {}; for (const i in Array.prototype) { arrProto[i] = Array.prototype[i]; delete Array.prototype[i]; } // ... do something here // rollback prototype extensions for (const i in arrProto) { Array.prototype[i] = arrProto[i]; }