将firebase类数组对象转换为数组

时间:2017-08-11 09:34:01

标签: javascript arrays algorithm firebase

我使用Firebase作为后端,我经常保存这样的数组:

var arr = [null, "Pete", "Mary", null, null, null, null, null, "Joe"]

由于Firebase不会将数组存储为数组,因此当我检索该值时,我会得到:

{ 1: "Pete", 2: "Mary", 8: "Joe" }

由于我经常存储数组,有时存储如下:

,这变得更加复杂
{
  1: { 1: "Pete", 2: "Mary", 8: "Joe" },
  4: { 4: "Lisa" }
}

我想将此对象恢复为原始数组数组,即:

[
  [null, null, null, null, null, null, null, null, null],
  ["Pete","Mary",null,null,null, null, null, null, "Joe"],
  [null, null, null, null, null, null, null, null, null],
  [null, null, null, null, null, null, null, null, null],
  [null, null, null, null, "Lisa",null,null, null, null]
]

我为数组数组实现了一个函数,它可以工作,但感觉非常非常糟糕。应该有一个更好的方法来做到这一点:

function firebaseToRealArray(fbArray) {
  if (Array.isArray(fbArray) || typeof fbArray === "undefined") {
    return fbArray
  } else {
      var keyss = Object.keys(fbArray);
      var height = +keyss[keyss.length - 1] + 1;
      var resultArray = [];
      var maxLength = _maxLength(fbArray, height)
      for (var i = 0; i < height; i++) {
        if (typeof fbArray[i] === "undefined") {
          resultArray.push(_objToArray(fbArray[i], maxLength))
        } else {
          resultArray.push(_objToArray(fbArray[i], maxLength))
        }
      }
      return resultArray;
  }
}

function _maxLength(arr, height) {
  var maxLength = 0;
  for (var i = 0; i < height; i++) {
    if (Array.isArray(arr[i])) {
      maxLength = Math.max(maxLength, arr[i].length)
    } else if (typeof arr[i] === "undefined") {
      maxLength = Math.max(maxLength, 0);
    } else {
      maxLength = Math.max(maxLength, +Object.keys(arr[i])[Object.keys(arr[i]).length - 1]);
    }
  }
  return maxLength + 1
}

function _objToArray(obj, l) {
  if (typeof obj === "undefined") {
    return _createArray(l, null)
  }
  var resArray = [];
  for (var i = 0; i < l; i++) {
    if (typeof obj[i] === "undefined") {
      resArray.push(null);
    } else {
      resArray.push(obj[i]);
    }
  }
  return resArray
}

function _createArray(len, itm) {
    var arr1 = [itm],
        arr2 = [];
    while (len > 0) {
        if (len & 1) arr2 = arr2.concat(arr1);
        arr1 = arr1.concat(arr1);
        len >>>= 1;
    }
    return arr2;
}

我的第一个问题是:

我是否可以使用firebase函数(客户端)将这些类似数组的对象转换为实际数组?

如果没有,我的问题就变成了:

自己实施此功能的最佳方式是什么?

或者:

还有其他我完全忽视的东西吗?

0 个答案:

没有答案