オブジェクト(JSON)から定義リスト(DL要素)を生成する

array2listを作ったついでにと思ったけど、こっちの方が実用性がありそう。array2listにも少し手を入れて、オブジェクトと配列の入れ子にも対応したので、JSONのdumpもできる。

function object2dl(object, doc) {
  if (!doc) doc = document;
  var dl, dt, dd, val;
  dl = doc.createElement('dl');
  for (key in object) if (object.hasOwnProperty(key)) {
    val = object[key];
    dt = dl.appendChild(doc.createElement('dt'));
    dt.appendChild(doc.createTextNode(key));
    dd = dl.appendChild(doc.createElement('dd'));
    if (Object.prototype.toString.call(val) === '[object Array]') {
      dd.appendChild(array2list(val, false, doc));
    } else if (typeof val === 'object') {
      dd.appendChild(object2dl(val, doc));
    } else {
      dd.appendChild(doc.createTextNode(val));
    }
  }
  return dl;
}

function array2list(array, ordered, doc) {
  if (!doc) doc = document;
  var list = doc.createElement(ordered ? 'ol' : 'ul'), li;
  for (var i = 0; i < array.length; ++i) {
    var item = array[i];
    if (Object.prototype.toString.call(item) === '[object Array]') {
      if (!li) li = list.appendChild(doc.createElement('li'));
      li.appendChild(array2list(item, ordered, doc));
    } else {
      li = list.appendChild(doc.createElement('li'));
      if (typeof item === 'object') {
        li.appendChild(object2dl(item, doc));
      } else {
        li.appendChild(doc.createTextNode(String(item)));
      }
    }
  }
  return list;
}