Это получит завтрашнюю дату:
var a = new Date((new Date()).valueOf() + 1000*3600*24);
function flatten(obj, includePrototype, into, prefix) {
into = into || {};
prefix = prefix || "";
for (var k in obj) {
if (includePrototype || obj.hasOwnProperty(k)) {
var prop = obj[k];
if (prop && typeof prop === "object" &&
!(prop instanceof Date || prop instanceof RegExp)) {
flatten(prop, includePrototype, into, prefix + k + "_");
}
else {
into[prefix + k] = prop;
}
}
}
return into;
}
Вы можете включить унаследованные члены, передав true
во второй параметр.
Несколько предостережений:
рекурсивные объекты не будут работать. Например:
var o = {a: "foo"};
ob = o;
сплющить (о);
будет рекурсивно повторяться до тех пор, пока не будет выдано исключение.
Как и в случае с ответом ruquay, это извлекает элементы массива, как обычные свойства объекта. Если вы хотите сохранить массивы нетронутыми, добавьте в исключения « || prop instanceof Array
».
Если вы вызываете это для объектов из другого окна или фрейма, даты и регулярные выражения не будут включены , поскольку instanceof
не будет работать должным образом. Вы можете исправить это, заменив его методом toString по умолчанию следующим образом:
Object.prototype.toString.call (prop) === "[object Date]"
Object.prototype.toString.call (prop) === "[объект RegExp]"
Object.prototype.toString.call (prop) === "[массив объектов]"
Вот быстрый, но будьте осторожны, b / c он будет не работать с массивами и нулевыми значениями (b / c их тип возвращает «объект»).
var flatten = function(obj, prefix) {
if(typeof prefix === "undefined") {
prefix = "";
}
var copy = {};
for (var p in obj) {
if(obj.hasOwnProperty(p)) {
if(typeof obj[p] === "object") {
var tmp = flatten(obj[p], p + "_");
for(var q in tmp) {
if(tmp.hasOwnProperty(q)) {
copy[prefix + q] = tmp[q];
}
}
}
else {
copy[prefix + p] = obj[p];
}
}
}
return copy;
}
var myObj = {
a: "level 1",
b: {
a: "level 2",
b: {
a: "level 3",
b: "level 3"
}
}
}
var flattened = flatten(myObj);