сжатие иерархий объектов в JavaScript

Это получит завтрашнюю дату:

var a = new Date((new Date()).valueOf() + 1000*3600*24);
10
задан Michael Hart 4 August 2011 в 13:12
поделиться

2 ответа

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) === "[массив объектов]"
    
21
ответ дан 3 December 2019 в 15:52
поделиться

Вот быстрый, но будьте осторожны, 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);
4
ответ дан 3 December 2019 в 15:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: