2017-10-13 102 views
1

我得到控制檯的數據以這種形式轉數在控制檯/打印

0:(8) [70, 61, 74, 79, 76, 63, 51, 51] 
1:(4) [64, 84, 84, 66] 
2:(2) [79, 69] 
3:(3) [77, 100, 98] 

我想打印我的數據在控制檯這樣的:

0:(4) [70, 64, 79, 77] 
1:(4) [61, 84, 69, 100] 
2:(4) [74, 84, 0, 0] 
3:(4) [79, 66, 98, 0] 
4:(4) [76, 0, 0, 0] 
5:(4) [63, 0, 0, 0] 
6:(4) [51, 0, 0, 0] 
7:(4) [51, 0, 0, 0] 

有了這個兩個函數I獲得行數的最大值,然後用0填充空列,但是我想顯示數據,例如我寫的例子。

function fillWithZeros(arr, length) { 
for (var i = 0; i < length; i++) { 
    if (arr[i] == null) { 
     arr[i] = 0; 
    } 
} 

return arr; 
}; 
function findMaxEvents(item){ 
var maxNumEvents = 0; 
for (var i = 0; i < item.length; i++){ 
    if (item[i] > maxNumEvents){ 
     maxNumEvents = item[i]; 
    } 
} 

return maxNumEvents; 
} 
+0

問,爲什麼是'98'上排'3',而不是'2'? – Rajesh

回答

1

我希望你實際上是在尋找移調現有的陣列。 感謝Transposing a 2D-array in JavaScript.

獲得的答案與你的答案有點不同。希望這有助於嘗試找到正確的方式來實現您的目標。

var array = [[70, 61, 74, 79, 76, 63, 51, 51], 
 
[64, 84, 84, 66], 
 
[79, 69], 
 
[77, 100, 98]]; 
 

 
var arrayWithMaxlen = array.map(function(a){return a.length;}).indexOf(Math.max.apply(Math, array.map(function(a){return a.length;}))); 
 
console.log("arrayWithMaxlen : " +arrayWithMaxlen); //gets index of array with max length 
 

 
var newArray = array[arrayWithMaxlen].map(function(col, i) { 
 
    return array.map(function(row) { 
 
    if(row[i]!=undefined)return row[i]; 
 
    else return 0; 
 
    }) 
 
}); 
 

 
console.log(newArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

請注意這個解決方案,如果第一個數組不是最長的,那麼結果將不包含原始值。因此,這個解決方案非常依賴數組的順序,以便返回正確的結果。 –

+1

謝謝@Nikolaj Dam Larsen。沒有注意到。希望更新的代碼可以解決這個問題。 –

+1

是的,完美。 :-)它可以做得更乾淨一些,但這只是細節。 –

0

只需轉置它。

順便說一句,接受的答案確實依賴於第一個內部數組長度。如果它更短,那麼其他所有更大的指數都消失了。

var array = [[70, 61, 74, 79, 76, 63, 51, 51], [64, 84, 84, 66], [79, 69], [77, 100, 98]], 
 
    result = array.reduce(function (r, a, i) { 
 
     a.forEach(function (b, j) { 
 
      r[j] = r[j] || Array.apply(null, { length: array.length }).map(function() { return 0; }); 
 
      r[j][i] = b; 
 
     }); 
 
     return r; 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

雖然我同意這個實現,但是在預期的輸出或者一些奇怪的原因中有一個錯誤,但是'3:(4)[79,66,98,0]'使得你的輸出不正確,並且可能會吸引不需要的評論。 – Rajesh

1

您所描述的操作基本上是一個簡單的矩陣轉置。有很多方法可以做到這一點。這裏有一個選擇:

var array = [ 
 
    [70, 61, 74, 79, 76, 63, 51, 51], 
 
    [64, 84, 84, 66], 
 
    [79, 69], 
 
    [77, 100, 98] 
 
]; 
 

 
function transpose(arr){ 
 
    var largest = arr.reduce(function(max, i){ return max.length > i.length ? max : i; }, []); 
 
    return largest.map(function(col, i){ 
 
    return arr.map(function(row){ 
 
     return row[i] || 0; 
 
    }); 
 
    }); 
 
} 
 

 
console.log(transpose(array));