mano
Version:
Web application framework
39 lines (35 loc) • 1.13 kB
JavaScript
;
var every = require('es5-ext/object/every')
, forEach = require('es5-ext/object/for-each')
, isPlainObject = require('es5-ext/object/is-plain-object')
, isArray = Array.isArray, push = Array.prototype.push
, re = /\[(\d*)\]$/;
module.exports = function (data) {
var toPush = {};
forEach(data, function (value, name) {
var match = name.match(re), nuName, nuValue;
if (!match) return;
nuName = name.slice(0, -match[0].length);
if (!data[nuName]) data[nuName] = [];
if (match[1]) {
data[nuName][match[1]] = value;
} else {
if (!toPush[nuName]) toPush[nuName] = [];
if (isPlainObject(value) && every(value, isArray)) {
nuValue = [];
forEach(value, function (value, key) {
value.forEach(function (value, index) {
if (!nuValue[index]) nuValue[index] = {};
nuValue[index][key] = value;
});
});
value = nuValue;
}
if (isArray(value)) push.apply(toPush[nuName], value);
else toPush[nuName].push(value);
}
delete data[name];
});
forEach(toPush, function (items, name) { push.apply(data[name], items); });
return data;
};