count-objects
Advanced tools
+1
-1
| { | ||
| "name": "count-objects", | ||
| "version": "1.1.11", | ||
| "version": "1.2.0", | ||
| "description": "Counts objects for each value", | ||
@@ -5,0 +5,0 @@ "main": "src/index.js", |
+31
-0
@@ -163,2 +163,33 @@ # count-objects | ||
| ### filtersCount | ||
| ```javascript | ||
| // returns how many objects were counted after implementing each filter: | ||
| const objects = [ | ||
| { a: 1, b: 2 }, | ||
| { a: 1, b: 2, c: 3 }, | ||
| { a: 1, b: 2, c: 3, d: 4 }, | ||
| { a: 1, b: 2, c: 3, d: 4, e: 5 }, | ||
| { a: 1 }, | ||
| ]; | ||
| const co = new CountObjects(objects); | ||
| co.addFilter(["a", "1"]); // 5 objects | ||
| co.addFilter(["b", "2"]); // 4 objects | ||
| co.addFilter(["c", "3"]); // 3 objects | ||
| co.addFilter(["d", "4"]); // 2 objects | ||
| co.addFilter(["e", "5"]); // 1 object | ||
| console.log(co.filtersCount()); | ||
| // [ 5, 4, 3, 2, 1 ] | ||
| co.clearFilters(); | ||
| co.addFilter(["b", "2"]); // 4 objects | ||
| co.addFilter(["d", "4"]); // 2 objects | ||
| co.addFilter(["c", "3"]); // 2 objects | ||
| co.addFilter(["e", "5"]); // 1 object | ||
| co.addFilter(["a", "1"]); // 1 object | ||
| console.log(co.filtersCount()); | ||
| /// [ 4, 2, 2, 1, 1 ] | ||
| ``` | ||
| ### count unique values | ||
@@ -165,0 +196,0 @@ |
@@ -121,20 +121,38 @@ const { | ||
| const intersectFilters = (union, filters) => { | ||
| const countPerFilter = (union, filters) => { | ||
| if (!filters.length) { | ||
| return null; | ||
| } | ||
| console.log(union); | ||
| const uniqueKeys = filters.map((filter) => { | ||
| return getUniqueKeys(union, filter); | ||
| }); | ||
| console.log(uniqueKeys); | ||
| return uniqueKeys.map((obj) => Object.keys(obj).length); | ||
| }; | ||
| const intersectFilters = (union, filters) => { | ||
| if (!filters.length) { | ||
| return { intersection: null, countIntersections: null }; | ||
| } | ||
| const uniqueKeys = filters.map((filter) => { | ||
| return getUniqueKeys(union, filter); | ||
| }); | ||
| // intersection of all the sets from left ot right | ||
| return uniqueKeys.reduce((acc, curr) => { | ||
| const intersectionArr = [uniqueKeys[0]]; | ||
| const intersection = uniqueKeys.reduce((acc, curr) => { | ||
| const keys = Object.keys(acc); | ||
| const intersection = {}; | ||
| const intersect = {}; | ||
| for (const key of keys) { | ||
| if (curr[key] !== undefined) { | ||
| intersection[key] = true; | ||
| intersect[key] = true; | ||
| } | ||
| } | ||
| return intersection; | ||
| intersectionArr.push(intersect); | ||
| return intersect; | ||
| }); | ||
| const countIntersections = intersectionArr.map( | ||
| (obj) => Object.keys(obj).length | ||
| ); | ||
| return { intersection, countIntersections }; | ||
| }; | ||
@@ -141,0 +159,0 @@ |
+6
-2
@@ -34,3 +34,3 @@ const { delimiter, uniqueKey, allObjects } = require("./constants"); | ||
| return count(this.union, { | ||
| filter: intersectFilters(this.union, this.filters), | ||
| filter: intersectFilters(this.union, this.filters).intersection, | ||
| }); | ||
@@ -41,3 +41,3 @@ } | ||
| return table(this.union, { | ||
| filter: intersectFilters(this.union, this.filters), | ||
| filter: intersectFilters(this.union, this.filters).intersection, | ||
| }); | ||
@@ -67,2 +67,6 @@ } | ||
| } | ||
| filtersCount() { | ||
| return intersectFilters(this.union, this.filters).countIntersections; | ||
| } | ||
| } | ||
@@ -69,0 +73,0 @@ module.exports = { |
+23
-0
@@ -87,1 +87,24 @@ const { CountObjects } = require("./index"); | ||
| console.log(co.getFilters()); | ||
| const objects2 = [ | ||
| { a: 1, b: 2 }, | ||
| { a: 1, b: 2, c: 3 }, | ||
| { a: 1, b: 2, c: 3, d: 4 }, | ||
| { a: 1, b: 2, c: 3, d: 4, e: 5 }, | ||
| { a: 1 }, | ||
| ]; | ||
| const co3 = new CountObjects(objects2); | ||
| co3.addFilter(["a", "1"]); | ||
| co3.addFilter(["b", "2"]); | ||
| co3.addFilter(["c", "3"]); | ||
| co3.addFilter(["d", "4"]); | ||
| co3.addFilter(["e", "5"]); | ||
| console.log(co3.filtersCount()); | ||
| co3.clearFilters(); | ||
| co3.addFilter(["b", "2"]); | ||
| co3.addFilter(["d", "4"]); | ||
| co3.addFilter(["c", "3"]); | ||
| co3.addFilter(["e", "5"]); | ||
| co3.addFilter(["a", "1"]); | ||
| console.log(co3.filtersCount()); |
+43
-8
| const { expect } = require("chai"); | ||
| const { users } = require("./data"); | ||
| const { flatten, unflatten } = require("flat"); | ||
@@ -464,4 +462,5 @@ const { | ||
| }; | ||
| const uniqueKeys = intersectFilters(union, []); | ||
| expect(uniqueKeys).to.be.null; | ||
| const { intersection, countIntersections } = intersectFilters(union, []); | ||
| expect(intersection).to.be.null; | ||
| expect(countIntersections).to.be.null; | ||
| return done(); | ||
@@ -488,4 +487,8 @@ }); | ||
| const uniqueKeys = intersectFilters(union, filters); | ||
| expect(uniqueKeys).to.be.eql(expectedResult); | ||
| const { intersection, countIntersections } = intersectFilters( | ||
| union, | ||
| filters | ||
| ); | ||
| expect(intersection).to.be.eql(expectedResult); | ||
| expect(countIntersections).to.be.eql([3]); | ||
@@ -516,8 +519,40 @@ return done(); | ||
| const uniqueKeys = intersectFilters(union, filters); | ||
| expect(uniqueKeys).to.be.eql(expectedResult); | ||
| const { intersection, countIntersections } = intersectFilters( | ||
| union, | ||
| filters | ||
| ); | ||
| expect(intersection).to.be.eql(expectedResult); | ||
| expect(countIntersections).to.be.eql([5, 3]); | ||
| return done(); | ||
| }); | ||
| it("intersects multiple filters", (done) => { | ||
| const objects = [ | ||
| { index: 0, a: 1 }, | ||
| { index: 1, a: 1, b: 2 }, | ||
| { index: 2, a: 1, b: 2, c: 3 }, | ||
| { index: 3, a: 1, b: 2, c: 3, d: 4 }, | ||
| { index: 4, a: 1, b: 2, c: 3, d: 4, e: 5 }, | ||
| ]; | ||
| const union = addArray({}, objects, { uniqueKey: "index" }); | ||
| const filters = [ | ||
| ["a", "1"], | ||
| ["b", "2"], | ||
| ["c", "3"], | ||
| ["d", "4"], | ||
| ["e", "5"], | ||
| ]; | ||
| const { intersection, countIntersections } = intersectFilters( | ||
| union, | ||
| filters | ||
| ); | ||
| expect(intersection).to.be.eql({ 4: true }); | ||
| expect(countIntersections).to.be.eql([5, 4, 3, 2, 1]); | ||
| return done(); | ||
| }); | ||
| }); | ||
| describe("CountObjects", () => { | ||
@@ -524,0 +559,0 @@ describe("add", () => { |
| module.exports = { | ||
| users: [ | ||
| { | ||
| id: 1, | ||
| name: "Leanne Graham", | ||
| username: "Bret", | ||
| email: "Sincere@april.biz", | ||
| address: { | ||
| street: "Kulas Light", | ||
| suite: "Apt. 556", | ||
| city: "Gwenborough", | ||
| zipcode: "92998-3874", | ||
| geo: { | ||
| lat: "-37.3159", | ||
| lng: "81.1496", | ||
| }, | ||
| }, | ||
| phone: "1-770-736-8031 x56442", | ||
| website: "hildegard.org", | ||
| company: { | ||
| name: "Romaguera-Crona", | ||
| catchPhrase: "Multi-layered client-server neural-net", | ||
| bs: "harness real-time e-markets", | ||
| }, | ||
| }, | ||
| { | ||
| id: 2, | ||
| name: "Ervin Howell", | ||
| username: "Antonette", | ||
| email: "Shanna@melissa.tv", | ||
| address: { | ||
| street: "Victor Plains", | ||
| suite: "Suite 879", | ||
| city: "Wisokyburgh", | ||
| zipcode: "90566-7771", | ||
| geo: { | ||
| lat: "-43.9509", | ||
| lng: "-34.4618", | ||
| }, | ||
| }, | ||
| phone: "010-692-6593 x09125", | ||
| website: "anastasia.net", | ||
| company: { | ||
| name: "Deckow-Crist", | ||
| catchPhrase: "Proactive didactic contingency", | ||
| bs: "synergize scalable supply-chains", | ||
| }, | ||
| }, | ||
| { | ||
| id: 3, | ||
| name: "Clementine Bauch", | ||
| username: "Samantha", | ||
| email: "Nathan@yesenia.net", | ||
| address: { | ||
| street: "Douglas Extension", | ||
| suite: "Suite 847", | ||
| city: "McKenziehaven", | ||
| zipcode: "59590-4157", | ||
| geo: { | ||
| lat: "-68.6102", | ||
| lng: "-47.0653", | ||
| }, | ||
| }, | ||
| phone: "1-463-123-4447", | ||
| website: "ramiro.info", | ||
| company: { | ||
| name: "Romaguera-Jacobson", | ||
| catchPhrase: "Face to face bifurcated interface", | ||
| bs: "e-enable strategic applications", | ||
| }, | ||
| }, | ||
| { | ||
| id: 4, | ||
| name: "Patricia Lebsack", | ||
| username: "Karianne", | ||
| email: "Julianne.OConner@kory.org", | ||
| address: { | ||
| street: "Hoeger Mall", | ||
| suite: "Apt. 692", | ||
| city: "South Elvis", | ||
| zipcode: "53919-4257", | ||
| geo: { | ||
| lat: "29.4572", | ||
| lng: "-164.2990", | ||
| }, | ||
| }, | ||
| phone: "493-170-9623 x156", | ||
| website: "kale.biz", | ||
| company: { | ||
| name: "Robel-Corkery", | ||
| catchPhrase: "Multi-tiered zero tolerance productivity", | ||
| bs: "transition cutting-edge web services", | ||
| }, | ||
| }, | ||
| { | ||
| id: 5, | ||
| name: "Chelsey Dietrich", | ||
| username: "Kamren", | ||
| email: "Lucio_Hettinger@annie.ca", | ||
| address: { | ||
| street: "Skiles Walks", | ||
| suite: "Suite 351", | ||
| city: "Roscoeview", | ||
| zipcode: "33263", | ||
| geo: { | ||
| lat: "-31.8129", | ||
| lng: "62.5342", | ||
| }, | ||
| }, | ||
| phone: "(254)954-1289", | ||
| website: "demarco.info", | ||
| company: { | ||
| name: "Keebler LLC", | ||
| catchPhrase: "User-centric fault-tolerant solution", | ||
| bs: "revolutionize end-to-end systems", | ||
| }, | ||
| }, | ||
| { | ||
| id: 6, | ||
| name: "Mrs. Dennis Schulist", | ||
| username: "Leopoldo_Corkery", | ||
| email: "Karley_Dach@jasper.info", | ||
| address: { | ||
| street: "Norberto Crossing", | ||
| suite: "Apt. 950", | ||
| city: "South Christy", | ||
| zipcode: "23505-1337", | ||
| geo: { | ||
| lat: "-71.4197", | ||
| lng: "71.7478", | ||
| }, | ||
| }, | ||
| phone: "1-477-935-8478 x6430", | ||
| website: "ola.org", | ||
| company: { | ||
| name: "Considine-Lockman", | ||
| catchPhrase: "Synchronised bottom-line interface", | ||
| bs: "e-enable innovative applications", | ||
| }, | ||
| }, | ||
| { | ||
| id: 7, | ||
| name: "Kurtis Weissnat", | ||
| username: "Elwyn.Skiles", | ||
| email: "Telly.Hoeger@billy.biz", | ||
| address: { | ||
| street: "Rex Trail", | ||
| suite: "Suite 280", | ||
| city: "Howemouth", | ||
| zipcode: "58804-1099", | ||
| geo: { | ||
| lat: "24.8918", | ||
| lng: "21.8984", | ||
| }, | ||
| }, | ||
| phone: "210.067.6132", | ||
| website: "elvis.io", | ||
| company: { | ||
| name: "Johns Group", | ||
| catchPhrase: "Configurable multimedia task-force", | ||
| bs: "generate enterprise e-tailers", | ||
| }, | ||
| }, | ||
| { | ||
| id: 8, | ||
| name: "Nicholas Runolfsdottir V", | ||
| username: "Maxime_Nienow", | ||
| email: "Sherwood@rosamond.me", | ||
| address: { | ||
| street: "Ellsworth Summit", | ||
| suite: "Suite 729", | ||
| city: "Aliyaview", | ||
| zipcode: "45169", | ||
| geo: { | ||
| lat: "-14.3990", | ||
| lng: "-120.7677", | ||
| }, | ||
| }, | ||
| phone: "586.493.6943 x140", | ||
| website: "jacynthe.com", | ||
| company: { | ||
| name: "Abernathy Group", | ||
| catchPhrase: "Implemented secondary concept", | ||
| bs: "e-enable extensible e-tailers", | ||
| }, | ||
| }, | ||
| { | ||
| id: 9, | ||
| name: "Glenna Reichert", | ||
| username: "Delphine", | ||
| email: "Chaim_McDermott@dana.io", | ||
| address: { | ||
| street: "Dayna Park", | ||
| suite: "Suite 449", | ||
| city: "Bartholomebury", | ||
| zipcode: "76495-3109", | ||
| geo: { | ||
| lat: "24.6463", | ||
| lng: "-168.8889", | ||
| }, | ||
| }, | ||
| phone: "(775)976-6794 x41206", | ||
| website: "conrad.com", | ||
| company: { | ||
| name: "Yost and Sons", | ||
| catchPhrase: "Switchable contextually-based project", | ||
| bs: "aggregate real-time technologies", | ||
| }, | ||
| }, | ||
| { | ||
| id: 10, | ||
| name: "Clementina DuBuque", | ||
| username: "Moriah.Stanton", | ||
| email: "Rey.Padberg@karina.biz", | ||
| address: { | ||
| street: "Kattie Turnpike", | ||
| suite: "Suite 198", | ||
| city: "Lebsackbury", | ||
| zipcode: "31428-2261", | ||
| geo: { | ||
| lat: "-38.2386", | ||
| lng: "57.2232", | ||
| }, | ||
| }, | ||
| phone: "024-648-3804", | ||
| website: "ambrose.net", | ||
| company: { | ||
| name: "Hoeger LLC", | ||
| catchPhrase: "Centralized empowering task-force", | ||
| bs: "target end-to-end models", | ||
| }, | ||
| }, | ||
| ], | ||
| }; |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
242
14.69%0
-100%38839
-7.28%10
-9.09%988
-14.09%