簡體   English   中英

乘法2數組javascript / jquery

[英]Multiplication 2 arrays javascript/jquery

我在js中有兩個對象數組,看起來像這樣:

Array1
   0:Object
      name: "name1"
      value:7
   1:Object
      name: "name2"
      value:5
   2:Object
      name: "name3"
      value:6

Array2
   0:Object
      name: "name1"
      value:3
   1:Object
      name: "name2"
      value:4
   2:Object
      name: "name3"
      value:8

我想創建第三個數組,其中包含來自array1和array2的乘法值的結果(不需要是對象數組-可以僅包含int值)。 這個意思:

Array1        Array2        Array3
value:7  *    value:3   =   value:21
value:5  *    value:4   =   value:20
value:6  *    value:8   =   value:48

您知道一種簡單而又好用的方法來創建具有上述值的第三個表並將其顯示在網站上嗎? 提前致謝 :)

純JavaScript,無需jQuery:

 function addArrays(arr1, arr2, prop) { var func = function(curr) { return curr[prop]; } var arr1v = arr1.map(func), arr2v = arr2.map(func), output = []; arr1v.forEach(function(curr, i){ output[i] = arr1v[i] * arr2v[i]; }); return output; } addArrays([{value:7},{value:5},{value:6}],[{value:3},{value:4},{value:8}],"value") //->[21, 20, 48] 

您可以使用LINQ的功能來合並兩個結果集,並選擇第三列作為兩個源列相乘的結果。 (就像在SQL中一樣)

LINQ的JavaScript實現在這里可以派上用場。 查看LinqJS:

http://linqjs.codeplex.com/

這是一篇很好的文章, 網址為http://www.codeproject.com/Articles/603742/LINQ-for-JavaScript

$ Linq看起來也很有前途https://jscriptlinq.codeplex.com/

您可以通過多種方式進行操作:

選項1:純JavaScript嵌套循環只需兩個嵌套循環,就可以使用純JavaScript做到這一點。 在大型陣列上,它相對較慢,但非常簡單。

選項2:具有預索引的純JavaScript循環可以對數組之一進行預索引以快速訪問它。

選項3:使用特殊的庫作為替代方案,您可以使用特殊的SQL或LINQ(如在其他答案中提到的)庫,例如Alasql ,其中該庫自動在第二個數組上創建索引以更快地訪問以避免不必要的循環。

性能:此jsPerf測試中,您可以比較連接10000 x 10000數組(簡單的嵌套循環和預索引 )時所有三個變體的速度。 選項2最快。

參見下面所有三個選項的工作片段,或在jsFiddle中使用它。

(免責聲明:我是Alasql的作者)

 var Array1 = [{name:'name1',value:7},{name:'name2',value:5},{name:'name3',value:6}]; var Array2 = [{name:'name1',value:3},{name:'name2',value:4},{name:'name3',value:8}]; // 1. Pure JavaScript option with nested loops var Array3 = []; for(var i=0;i<Array1.length;i++) { for(var j=0;j<Array2.length;j++) { if(Array1[i].name == Array2[j].name) { Array3.push({value:Array1[i].value * Array2[i].value}); break; } } } document.getElementById("res1").textContent = JSON.stringify(Array3); // 2. Preindexation version var idx = {}; for(var j=0;j<Array2.length;j++) { idx[Array2[j].name] = Array2[j].value; } var Array3 = []; for(var i=0;i<Array1.length;i++) { Array3.push({value:Array1[i].value * idx[Array1[i].name]}); } document.getElementById("res2").textContent = JSON.stringify(Array3); // 3. SQL library option var Array3 = alasql('SELECT Array1.[value]*Array2.[value] AS [value] \\ FROM ? Array1 JOIN ? Array2 USING name',[Array1, Array2]); document.getElementById("res3").textContent = JSON.stringify(Array3); 
 <script src="http://alasql.org/console/alasql.min.js"></script> <p>Pure JavaScript nested loops: </p><div id="res1"></div> <p>Pure JavaScript preindexation: </p><div id="res2"></div> <p>Alasql version: </p><div id="res3"></div> 

嘗試這個

var ar3 = [];
for(var i = 0; i <= array1.length; i++){
    var valu = array1[i].value * array2[i].value;
    ar3[i] = valu;
}

真的,我很想知道為什么這里會有一個復雜的答案,而Javascript是一種功能編程語言:

僅一行:

array3= array1.map(function(e,i){return {value : (e.value * array2[i].value)}; }) ; 

小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM