乘法2数组javascript / jquery

时间:2015-01-18 19:12:04

标签: javascript jquery html arrays

我在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

您是否知道使用上述值创建第三个表并在网站上显示的简单方法? 在此先感谢:)

5 个答案:

答案 0 :(得分:1)

纯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]




答案 1 :(得分:0)

您可以使用LINQ的强大功能连接两个结果集,并选择第三列作为两个源列相乘的结果。 (就像你在SQL中所做的那样)

LINQ的JavaScript实现在这里非常方便。看看LinqJS:

http://linqjs.codeplex.com/

这里有一篇很好的文章http://www.codeproject.com/Articles/603742/LINQ-for-JavaScript

$ Linq看起来很有希望https://jscriptlinq.codeplex.com/

答案 2 :(得分:0)

您可以通过多种方式完成此操作:

选项1:纯JavaScript嵌套循环 只需使用两个嵌套循环就可以使用纯JavaScript。它在大数组上相对较慢,但非常简单。

选项2:带预引用的纯JavaScript循环 您可以对其中一个数组进行预索引以快速访问它。

选项3:使用特殊库 作为替代方案,您可以使用特殊的SQL或LINQ(如其他答案中所述)库,例如Alasql,其中库自动在第二个阵列上创建索引以更快地访问以避免不必要的循环。

性能: 您可以在this jsPerf test中比较加入10000 x 10000阵列(简单嵌套循环和预索引)时所有三种变体的速度。选项2最快。

使用所有三个选项查看下面的工作代码段或使用它in 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>

答案 3 :(得分:0)

试试这个

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

答案 4 :(得分:0)

真的,我想知道为什么这里有一个复杂的答案,而Javascript是一种函数式编程语言:

只需一行:

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

Fiddle