2017-01-23 75 views
0

我正在嘗試使用Array.prototype(歡迎您致電其他方法)中的方法創建n * n標識矩陣。我可以使用fill()創建一個n*n矩陣,但無法在不使用if-else的情況下將對角線元素轉換爲。使用高階函數的N * N大小的標識矩陣

function matrix(n) { 
 
    var nSizeArray = Array(n).fill().map(function(elem) { 
 
    return Array(elem).fill(0).indexOf([elem][elem]=1) 
 
    }) 
 
    return nSizeArray 
 
} 
 
matrix(5)

以上只是我希望做一些演示。我無法圍繞如何使用可用的數組方法填充陣列並訪問數組中的元素[i][i]

+0

else-if絕對沒有錯。 – Bergi

回答

1

編輯:哦,我剛纔看到你寫只在Array.prototype方法不只是只是起到了 ...所以我猜你不想包括Math功能要麼?

map的第二個參數是元素的索引,我們將用它來填充矩陣中的正確點,使用1 s。

現在,我們需要一種方法來分配1在與i == j每個位置和0每隔一個位置,而無需使用明顯if..else方法。我們可以使用i == j相當於i - j == 0的事實。

所以,現在的任務是每一個(i,j)i - j == 01i - j != 00映射。

我們這樣做是使用下面這行:

return 1 - Math.min(Math.abs(i-j),1); 

Math.min(...)確保i - j == 0映射到0和所有其他指數的組合被映射到1(因爲它們導致|i-j| >= 1)。通過從1減去這個結果,我們可以簡單地翻轉並得到我們想要的結果:

function matrix(n) { 
 
    return Array(n).fill(0).map(function(elem, i) { 
 
    return Array(n).fill(0).map(function(elem2, j) { 
 
     return 1 - Math.min(Math.abs(i-j),1); 
 
    }); 
 
    }); 
 
}

+0

我在類似的東西上摸索了一些我無法解釋的東西。也許你可以幫忙。爲什麼內在的地圖不做任何事情? https://jsfiddle.net/4e7nh6vz/1/ –

+2

derp ...算了一下...... map不修改源數組本身,它只是返回修改後的一個 –

1

你可以嘗試使用:

function matrix(n) { 
    return Array(n).fill(Array(n).fill()) 
    .map(function (xs, i) { 
     return xs.map(function (x, j) { 
      return i === j ? 1 : 0; 
     }) 
    }); 
} 
matrix(5) 

如果你不這樣做如果使用else(或三元操作),結果將是一個boleean矩陣。

+0

我覺得使用'Array :: fill'是更現代化(更符合OP的原始代碼)。如果您認爲這太侵入,請隨時回滾編輯 – Bergi