From 4fb0169ecb4e17521f85022a0c0b7086c71bcfc2 Mon Sep 17 00:00:00 2001 From: Chris Lingwood Date: Fri, 30 Dec 2016 13:13:19 +0000 Subject: [PATCH 1/2] added nested functionality --- index.js | 107 +++++++++++++++++++++++------------------ test/nestedTester.js | 111 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 46 deletions(-) create mode 100644 test/nestedTester.js diff --git a/index.js b/index.js index 41f3bc8..65bc4bc 100644 --- a/index.js +++ b/index.js @@ -2,29 +2,29 @@ var _ = require('lodash'); -exports.DataTransform = function(data, map){ +exports.DataTransform = function (data, map) { return { - getValue : function(obj, key) { + getValue: function (obj, key) { - if(typeof(obj) == "undefined") { + if (typeof (obj) == "undefined") { return ""; } - if(key == '' || key == undefined) { + if (key == '' || key == undefined) { return obj; } var value = obj || data, key = key || map.list, keys = null; - if(key == "") { + if (key == "") { value = ""; } else { keys = key.split('.'); - for(var i = 0; i < keys.length; i++ ) { - if(typeof(value) !== "undefined" && + for (var i = 0; i < keys.length; i++) { + if (typeof (value) !== "undefined" && keys[i] in value) { value = value[keys[i]]; } else { @@ -32,104 +32,119 @@ exports.DataTransform = function(data, map){ } } } - + return value; }, - setValue : function(obj, key, newValue) { + setValue: function (obj, key, newValue) { - if(typeof(obj) == "undefined") { + if (typeof (obj) == "undefined") { return; } - if(key == '' || key == undefined) { + if (key == '' || key == undefined) { return; } - if(key == "") { + if (key == "") { return; - } - + } + keys = key.split('.'); var target = obj; - for(var i = 0; i < keys.length; i++ ) { - if(i == keys.length-1){ + for (var i = 0; i < keys.length; i++) { + if (i == keys.length - 1) { target[keys[i]] = newValue; return; } - if(keys[i] in target) + if (keys[i] in target) target = target[keys[i]]; else return; } }, - getList: function(){ + getList: function () { return this.getValue(data, map.list); }, - transform : function() { + transform: function () { var value = this.getValue(data, map.list), - normalized = {}; - if(value) { + normalized = {}; + if (value) { var list = this.getList(); var normalized = map.item ? _.map(list, _.bind(this.iterator, this, map.item)) : list; normalized = _.bind(this.operate, this, normalized)(); + normalized = _.bind(this.nested, this, normalized)(); normalized = this.each(normalized); } - return normalized; + return normalized; }, - operate: function(data) { + operate: function (data) { - if(map.operate) { - _.each(map.operate, _.bind(function(method){ - data = _.map(data, _.bind(function(item){ + if (map.operate) { + _.each(map.operate, _.bind(function (method) { + data = _.map(data, _.bind(function (item) { var fn; - if( 'string' === typeof method.run ) { - fn = eval( method.run ); + if ('string' === typeof method.run) { + fn = eval(method.run); } else { fn = method.run; } - this.setValue(item,method.on,fn(this.getValue(item,method.on))) + this.setValue(item, method.on, fn(this.getValue(item, method.on))) return item; - },this)); - },this)); + }, this)); + }, this)); } return data; }, - each: function(data){ - if( map.each ) { + nested: function (data) { + if (map.nested) { + _.each(map.nested, _.bind(function (nestDefinition) { + data = _.map(data, _.bind(function (item) { + var dataTransform = exports.DataTransform(item, nestDefinition); + this.setValue(item, nestDefinition.list, dataTransform.transform()); + return item; + }, this)); + }, this)); + } + return data; + }, + + each: function (data) { + if (map.each) { _.each(data, map.each); - } + } return data; }, - iterator : function(map, item) { + iterator: function (map, item) { var obj = {}; //to support simple arrays with recursion - if(typeof(map) == "string") { + if (typeof (map) == "string") { return this.getValue(item, map); } - _.each(map, _.bind(function(oldkey, newkey) { - if(typeof(oldkey) == "string" && oldkey.length > 0) { + _.each(map, _.bind(function (oldkey, newkey) { + if (typeof (oldkey) == "string" && oldkey.length > 0) { obj[newkey] = this.getValue(item, oldkey); - } else if( _.isArray(oldkey) ) { - array = _.map(oldkey, _.bind(function(item,map) {return this.iterator(map,item)}, this , item));//need to swap arguments for bind + } else if (_.isArray(oldkey)) { + array = _.map(oldkey, _.bind(function (item, map) { + return this.iterator(map, item) + }, this, item)); //need to swap arguments for bind obj[newkey] = array; - } else if(typeof oldkey == 'object'){ - var bound = _.bind(this.iterator, this, oldkey,item) + } else if (typeof oldkey == 'object') { + var bound = _.bind(this.iterator, this, oldkey, item) obj[newkey] = bound(); - } - else { + } else { obj[newkey] = ""; - } + } }, this)); return obj; @@ -138,4 +153,4 @@ exports.DataTransform = function(data, map){ }; -}; +}; \ No newline at end of file diff --git a/test/nestedTester.js b/test/nestedTester.js new file mode 100644 index 0000000..3a6591a --- /dev/null +++ b/test/nestedTester.js @@ -0,0 +1,111 @@ +var DataTransform = require('../index.js').DataTransform, + _ = require("underscore"); + +let map = { + list: 'items', + item: { + id: 'id', + sku: 'sku', + zero: 'zero', + toReplace: 'sku', + errorReplace: 'notFound', + simpleArray: ['id', 'sku', 'sku'], + complexArray: [{ + node: 'id' + }, { + otherNode: 'sku' + }, { + toReplace: 'sku' + }], + subObject: { + node1: 'id', + node2: 'sku', + subSubObject: { + node1: 'id', + node2: 'sku', + } + }, + others: 'duplicates', + deeplyNested: { + list: 'deep.duplicates' + }, + nest: 'nested' + }, + nested: [{ + list: 'others', + item: { + newSKU: 'sku', + newID: 'id' + } + + }, { + list: 'deeplyNested.list', + item: { + newSKU: 'sku', + newID: 'id' + } + }, { + list: 'nest', + item: { + skus: 'skus', + newID: 'id' + }, + nested: [{ + list: 'skus', + item: { + alternateSKU: 'subSKU', + } + }] + }, + { + list: 'others', + item: { + newSKU: 'sku', + newID: 'id' + } + + }] +}; + +let object = { + items: [{ + id: 'books', + zero: 0, + sku: '10234-12312', + duplicates: [{ + id: 'otherBook', + sku: '10234-12313' + }, { + id: 'thirdBook', + sku: '10234-12314' + }], + deep: { + duplicates: [{ + id: 'otherBook', + sku: '10234-12313' + }, { + id: 'thirdBook', + sku: '10234-12314' + }] + }, + nested: [{ + id: 'otherBook', + skus: [{ + subSKU: '1023' + }] + }, { + id: 'thirdBook', + skus: [{ + subSKU: '1024' + }, + { + subSKU: '1023' + }] + }] + }] +} + +let dataTransform = new DataTransform(object, map); +let result = dataTransform.transform(); + +console.log(JSON.stringify(result, null, 4)); \ No newline at end of file From fc9b6b157f4a17595b1b89b700d0102bc7d08e42 Mon Sep 17 00:00:00 2001 From: Chris Lingwood Date: Fri, 30 Dec 2016 13:22:29 +0000 Subject: [PATCH 2/2] removed code formatting changes --- index.js | 91 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/index.js b/index.js index 65bc4bc..ab18d63 100644 --- a/index.js +++ b/index.js @@ -2,29 +2,29 @@ var _ = require('lodash'); -exports.DataTransform = function (data, map) { +exports.DataTransform = function(data, map){ return { - getValue: function (obj, key) { + getValue : function(obj, key) { - if (typeof (obj) == "undefined") { + if(typeof(obj) == "undefined") { return ""; } - if (key == '' || key == undefined) { + if(key == '' || key == undefined) { return obj; } var value = obj || data, key = key || map.list, keys = null; - if (key == "") { + if(key == "") { value = ""; } else { keys = key.split('.'); - for (var i = 0; i < keys.length; i++) { - if (typeof (value) !== "undefined" && + for(var i = 0; i < keys.length; i++ ) { + if(typeof(value) !== "undefined" && keys[i] in value) { value = value[keys[i]]; } else { @@ -32,72 +32,72 @@ exports.DataTransform = function (data, map) { } } } - + return value; }, - setValue: function (obj, key, newValue) { + setValue : function(obj, key, newValue) { - if (typeof (obj) == "undefined") { + if(typeof(obj) == "undefined") { return; } - if (key == '' || key == undefined) { + if(key == '' || key == undefined) { return; } - if (key == "") { + if(key == "") { return; - } - + } + keys = key.split('.'); var target = obj; - for (var i = 0; i < keys.length; i++) { - if (i == keys.length - 1) { + for(var i = 0; i < keys.length; i++ ) { + if(i == keys.length-1){ target[keys[i]] = newValue; return; } - if (keys[i] in target) + if(keys[i] in target) target = target[keys[i]]; else return; } }, - getList: function () { + getList: function(){ return this.getValue(data, map.list); }, - transform: function () { + transform : function() { var value = this.getValue(data, map.list), - normalized = {}; - if (value) { + normalized = {}; + if(value) { var list = this.getList(); var normalized = map.item ? _.map(list, _.bind(this.iterator, this, map.item)) : list; normalized = _.bind(this.operate, this, normalized)(); normalized = _.bind(this.nested, this, normalized)(); normalized = this.each(normalized); } - return normalized; + return normalized; }, - operate: function (data) { + operate: function(data) { - if (map.operate) { - _.each(map.operate, _.bind(function (method) { - data = _.map(data, _.bind(function (item) { + if(map.operate) { + _.each(map.operate, _.bind(function(method){ + data = _.map(data, _.bind(function(item){ var fn; - if ('string' === typeof method.run) { - fn = eval(method.run); + if( 'string' === typeof method.run ) { + fn = eval( method.run ); } else { fn = method.run; } - this.setValue(item, method.on, fn(this.getValue(item, method.on))) + this.setValue(item,method.on,fn(this.getValue(item,method.on))) return item; - }, this)); - }, this)); + },this)); + },this)); } return data; @@ -116,35 +116,34 @@ exports.DataTransform = function (data, map) { return data; }, - each: function (data) { - if (map.each) { + each: function(data){ + if( map.each ) { _.each(data, map.each); - } + } return data; }, - iterator: function (map, item) { + iterator : function(map, item) { var obj = {}; //to support simple arrays with recursion - if (typeof (map) == "string") { + if(typeof(map) == "string") { return this.getValue(item, map); } - _.each(map, _.bind(function (oldkey, newkey) { - if (typeof (oldkey) == "string" && oldkey.length > 0) { + _.each(map, _.bind(function(oldkey, newkey) { + if(typeof(oldkey) == "string" && oldkey.length > 0) { obj[newkey] = this.getValue(item, oldkey); - } else if (_.isArray(oldkey)) { - array = _.map(oldkey, _.bind(function (item, map) { - return this.iterator(map, item) - }, this, item)); //need to swap arguments for bind + } else if( _.isArray(oldkey) ) { + array = _.map(oldkey, _.bind(function(item,map) {return this.iterator(map,item)}, this , item));//need to swap arguments for bind obj[newkey] = array; - } else if (typeof oldkey == 'object') { - var bound = _.bind(this.iterator, this, oldkey, item) + } else if(typeof oldkey == 'object'){ + var bound = _.bind(this.iterator, this, oldkey,item) obj[newkey] = bound(); - } else { - obj[newkey] = ""; } + else { + obj[newkey] = ""; + } }, this)); return obj;