2017-08-11 117 views
0

我使用火力地堡作爲後端,我經常保存陣列是這樣的:轉換火力陣列狀物體到陣列

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

由於火力地堡不存儲數組作爲陣列,當檢索到的值,我得到這樣的:

{ 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; 
} 

我的第一個問題是:

有沒有我可以使用,客戶端,這些類似數組的對象轉換爲一個火力點功能實際的數組?

如果不是這樣,我的問題是:

什麼來實現這個功能,我自己的最好方法?

或者:

有沒有別的東西,我完全可以俯瞰?

+0

您可以檢查我的方法來創建此數組[這裏](https://jsfiddle.net/nj0ttm2w/)。 – Shubham

+0

謝謝,但我不知道最長陣列的長度。 – Sventies

回答

0

我想,除了你的二維示例,下面的代碼片段工作得很好,它可能會相當嵌套。所以我的方法也會處理這個問題;

我們的投入是

{ 1: { 1: "Pete", 
     2: "Mary", 
     5: {1: "John", 
      3: "Terry" }, 
     8: "Joe" }, 
    4: { 4: "Lisa" } 
}; 

,這就是我們得到的;

[[null,null,null,null,null,null,null,null,null], 
[[null,null,null,null], 
    ["Pete",null,null,null], 
    ["Mary",null,null,null], 
    [null,null,null,null], 
    [null,null,null,null], 
    [null,"John",null,"Terry"], 
    [null,null,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,null,null,null,"Lisa",null,null,null,null]] 

所以;

function arrayishToArray(a){ 
 
    var ok = Object.keys(a), 
 
     arr; 
 
    
 
    a.length = +ok[ok.length-1] + 1; 
 
    arr = Array.from(a) 
 
      .map(v => typeof v === "object" ? arrayishToArray(v) : v); 
 
    return arr.map(function(sa){ 
 
        return this.len ? Array.isArray(sa) ? sa.concat(Array(this.len - sa.length).fill(null)) 
 
                 : [sa || null].concat(Array(this.len-1).fill(null)) 
 
            : sa;     
 
       }, {len: Math.max(...arr.map(e => Array.isArray(e) ? e.length : 0))}); 
 
} 
 

 
var arrayish = { 1: { 1: "Pete", 2: "Mary", 5: {1: "John", 3: "Terry"}, 8: "Joe" }, 
 
        4: { 4: "Lisa" } 
 
       }; 
 
console.log(JSON.stringify(arrayishToArray(arrayish)))