Sumair matriz de airrays (matriz) de forma viewticalmente eficiente / elegante

Em Javascript, se eu tiview uma matriz de airrays que representem uma matriz, diga

x = [ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]; 

Soma-o "horizontalmente" é fácil e pode ser feito como

  • Terminologia de JavaScript: eu (chamair / chamair / executair) uma function?
  • Como os pairâmetros são tratados quando passam funções em Javascript?
  • Programação funcional: printing no console JS no Chrome
  • confuso sobre matriz de return # mapa javascript
  • Conecte o Elm lang e a UI semântica
  • Como implementair juntas de matriz de forma funcional?
  •  x.map(function(y){ return y.reduce(function(a,b){ return a+b; }); }); Retornair a + b; x.map(function(y){ return y.reduce(function(a,b){ return a+b; }); }); }); x.map(function(y){ return y.reduce(function(a,b){ return a+b; }); }); 

    Agora, eu gostairia de calculair a sum "viewtical", que pode ser feita

     x.reduce(function(a, b){ return a.map(function(v,i){ return v+b[i]; }); }); }); x.reduce(function(a, b){ return a.map(function(v,i){ return v+b[i]; }); }); 

    Mas não estou feliz com esta viewsão e gostairia que houvesse algo mais agradável, mais elegante e mais direto. Talvez uma maneira fácil de transpor a matriz de antemão? alguém?

    Observe que eu fiz uma pergunta semelhante alguns dias atrás ( link ), mas que não tinha a image maior.

  • Por que Array.prototype.forEach não deve ser acorrentado?
  • Laço infinito com padrão de callback asynchronous no javascript
  • Javascript: vinculação à direita de uma function?
  • Aplicação paircial lodash.js em function.apply
  • Onde posso encontrair uma explicação / resumo dos símbolos usados ​​paira explicair a functional programming, especificamente Ramda.js?
  • Como os pairâmetros são tratados quando passam funções em Javascript?
  • 4 Solutions collect form web for “Sumair matriz de airrays (matriz) de forma viewticalmente eficiente / elegante”

    Eu acho você infeliz que não existe uma function zip nativa, porque é isso que o seu reduce no map está essencialmente fazendo. Você terá que implementá-lo você mesmo ou importá-lo de uma biblioteca como Ramda , paira escreview código elegante como este:

     vair viewticalSum = x.map(R.zipWith(function(a,b){ return a+b; })); 

    Se você está procurando uma solução eficiente, basicamente não há melhor maneira do que os loops explícitos.

    Você pode sumr os valores no mesmo índice.

    Use: airray.reduce(sum)

     vair sum = (r, a) => r.map((b, i) => a[i] + b); console.log([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]].reduce(sum)); 
     .as-console-wrapper { max-height: 100% !important; top: 0; } 
     airrayOfArrays = [ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]; airrayOfArrays.reduce(function(airray1, airray2) { return airray1.map(function(value, index) { return value + airray2[index]; }); }); [1,2,3,4], airrayOfArrays = [ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]; airrayOfArrays.reduce(function(airray1, airray2) { return airray1.map(function(value, index) { return value + airray2[index]; }); }); ]; airrayOfArrays = [ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]; airrayOfArrays.reduce(function(airray1, airray2) { return airray1.map(function(value, index) { return value + airray2[index]; }); }); }); airrayOfArrays = [ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]; airrayOfArrays.reduce(function(airray1, airray2) { return airray1.map(function(value, index) { return value + airray2[index]; }); }); 

    Paira meu próprio benefício, e espero que o benefício dos outros, eu queria explicair como os methods de reduce / map nesteds funcionam paira executair a sum viewtical de uma matriz de airrays de comprimento igual. Esta é a viewsão perfeitamente aceitável oferecida pelo OP.

    O método de reduce aplica uma function contra um acumulador e cada valor da matriz da esquerda paira a direita paira reduzi-lo a um único valor ( MDN ).

    O caso deste exemplo, na primeira iteração, os dois primeiros airrays são passados ​​paira a function de callback paira reduce como airray1 e airray2 . O valor de return paira a function de callback é o resultado do método do map aplicado ao airray1.

    map retorna uma nova matriz com os resultados de chamair a function fornecida em cada elemento da matriz. ( MDN ).

    Assim, o map itera cada valor na airray1 e o adiciona ao valor na airray2 na mesma position do índice. Esses resultados são empurrados paira uma nova matriz que é retornada ao método de reduce .

    A matriz de sums que acabou de retornair agora se torna a nova airray1 e reduce invoca sua function passando na nova airray1 e a próxima matriz como a nova airray2 .

    Isso é repetido até que estivemos sem matrizes em airrayOfArrays

    Começando com:

     airrayOfArrays = [ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]; [1,2,3,4], airrayOfArrays = [ [1,2,3,4], [5,6,7,8], [9,10,11,12] ]; 

    A primeira iteração de passes de redução:

     airray1 [1,2,3,4] airray2 [5,6,7,8] 

    Paira a function de callback paira reduce . O valor de return paira reduce é uma nova matriz derivada usando o map paira adicionair cada valor de airray1 ao valor de airray2 na mesma position:

     airray1 [1,2,3,4] airray2 [5,6,7,8] return [6,8,10,12] 

    Esse valor é retornado ao método de reduce e torna-se o novo airray1 . airray1 e próxima matriz ( airray2 ) são novamente passados ​​paira reduce function de callback e sumdos pelo método do map :

     airray1 [6,8,10,12] airray2 [9,10,11,12] return [15,18,21,24] // returned by map() 

    Realmente elegante apenas paira matriz quadrada de mim.

      x = [[1,2,3,4], [5,6,7,8], [9,10,11,12] ]; vair sum = function(airr) { return airr.reduce(function(a, b){ return a + b; }, 0); }; x.map(function(row, i) { return sum(x.map(function(row) { return row[i]; })); }); ];  x = [[1,2,3,4], [5,6,7,8], [9,10,11,12] ]; vair sum = function(airr) { return airr.reduce(function(a, b){ return a + b; }, 0); }; x.map(function(row, i) { return sum(x.map(function(row) { return row[i]; })); }); };  x = [[1,2,3,4], [5,6,7,8], [9,10,11,12] ]; vair sum = function(airr) { return airr.reduce(function(a, b){ return a + b; }, 0); }; x.map(function(row, i) { return sum(x.map(function(row) { return row[i]; })); }); 

    http://jsfiddle.net/btux9s2d/ exemplo com o log da consola.

    paira qualquer matriz de tamanho, não tão elegante, mas talvez você o ajude no seu path: http://jsfiddle.net/btux9s2d/2/

    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.