Comparing version 0.0.2 to 0.1.0
34
index.js
var flat = module.exports = {} | ||
var flatten = flat.flatten = function (target, delimeter) { | ||
var flatten = flat.flatten = function (target, opts) { | ||
var output = {} | ||
, delimeter = delimeter || '.' | ||
, opts = opts || {} | ||
, delimiter = opts.delimiter || '.' | ||
function getkey(key, prev) { | ||
return prev ? prev + delimeter + key : key | ||
return prev ? prev + delimiter + key : key | ||
}; | ||
@@ -13,3 +14,6 @@ | ||
Object.keys(object).forEach(function(key) { | ||
if (typeof object[key] === 'object') { | ||
var isarray = opts.safe && Array.isArray(object[key]) | ||
, isobject = typeof object[key] === 'object' | ||
if (!isarray && isobject) { | ||
return step(object[key] | ||
@@ -29,12 +33,18 @@ , getkey(key, prev) | ||
var unflatten = flat.unflatten = function (target, delimeter) { | ||
var unflatten = flat.unflatten = function (target, opts) { | ||
if (typeof target !== 'object') return target | ||
target = flatten(target, delimeter) | ||
var opts = opts || {} | ||
, delimiter = opts.delimiter || '.' | ||
var keys = Object.keys(target) | ||
, delimeter = delimeter || '.' | ||
if (opts.safe && Array.isArray(target)) { | ||
return target.map(function(value) { | ||
return unflatten(value, opts); | ||
}); | ||
} | ||
var unflat = keys.reduce(function (memo, key) { | ||
var split = key.split(delimeter) | ||
target = flatten(target, opts) | ||
var unflat = Object.keys(target).reduce(function (memo, key) { | ||
var split = key.split(delimiter) | ||
, first = split.shift() | ||
@@ -48,5 +58,5 @@ | ||
memo[first] = memo[first] || {} | ||
memo[first][split.join(delimeter)] = target[key] | ||
memo[first][split.join(delimiter)] = target[key] | ||
memo[first] = unflatten(memo[first], delimeter) | ||
memo[first] = unflatten(memo[first], opts) | ||
@@ -53,0 +63,0 @@ return memo; |
{ | ||
"name": "flat", | ||
"version": "0.0.2", | ||
"version": "0.1.0", | ||
"main": "index.js", | ||
@@ -5,0 +5,0 @@ "scripts": { |
@@ -14,3 +14,3 @@ # flat [![Build Status](https://secure.travis-ci.org/hughsk/flat.png?branch=master)](http://travis-ci.org/hughsk/flat) | ||
### flat.flatten(original, [delimiter='.']) | ||
### flat.flatten(original, options) | ||
@@ -40,3 +40,3 @@ Flattens the object - it'll return an object one level deep, regardless of how | ||
### flat.flatten(original, [delimiter='.']) | ||
### flat.flatten(original, options) | ||
@@ -63,2 +63,37 @@ Flattening is reversible too, you can call `flat.unflatten()` on an object: | ||
// } | ||
``` | ||
## Options | ||
### delimiter | ||
Use a custom delimiter for (un)flattening your objects, instead of `.`. | ||
### safe | ||
When enabled, both `flat` and `unflatten` will preserve arrays and their | ||
contents. This is disabled by default. | ||
``` javascript | ||
var flatten = require('flat').flatten | ||
flatten({ | ||
this: [ | ||
{ contains: 'arrays' }, | ||
{ preserving: { | ||
them: 'for you' | ||
}} | ||
] | ||
}, { | ||
safe: true | ||
}) | ||
// { | ||
// 'this': [ | ||
// { contains: 'arrays' }, | ||
// { preserving: { | ||
// them: 'for you' | ||
// }} | ||
// ] | ||
// } | ||
``` |
@@ -55,3 +55,5 @@ var assert = require('assert') | ||
} | ||
}, ':'), { | ||
}, { | ||
delimiter: ':' | ||
}), { | ||
'hello:world:again': 'good morning' | ||
@@ -113,3 +115,5 @@ }) | ||
'hello world again': 'good morning' | ||
}, ' ')) | ||
}, { | ||
delimiter: ' ' | ||
})) | ||
}) | ||
@@ -147,2 +151,41 @@ test('Messy', function() { | ||
}) | ||
suite('.safe', function() { | ||
test('Should protect arrays when true', function() { | ||
assert.deepEqual(flatten({ | ||
hello: [ | ||
{ world: { again: 'foo' } } | ||
, { lorem: 'ipsum' } | ||
] | ||
, another: { | ||
nested: [{ array: { too: 'deep' }}] | ||
} | ||
, lorem: { | ||
ipsum: 'whoop' | ||
} | ||
}, { | ||
safe: true | ||
}), { | ||
hello: [ | ||
{ world: { again: 'foo' } } | ||
, { lorem: 'ipsum' } | ||
] | ||
, 'lorem.ipsum': 'whoop' | ||
, 'another.nested': [{ array: { too: 'deep' }}] | ||
}) | ||
}) | ||
test('Should not protect arrays when false', function() { | ||
assert.deepEqual(flatten({ | ||
hello: [ | ||
{ world: { again: 'foo' } } | ||
, { lorem: 'ipsum' } | ||
] | ||
}, { | ||
safe: false | ||
}), { | ||
'hello.0.world.again': 'foo' | ||
, 'hello.1.lorem': 'ipsum' | ||
}) | ||
}) | ||
}) | ||
}) |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
9056
230
96