diff --git a/index.js b/index.js index 41f3bc8..ab18d63 100644 --- a/index.js +++ b/index.js @@ -76,6 +76,7 @@ exports.DataTransform = function(data, map){ 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; @@ -102,6 +103,19 @@ exports.DataTransform = function(data, map){ }, + 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); @@ -138,4 +152,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