【问题标题】:Multiplication 2 arrays javascript/jquery乘法 2 数组 javascript/jquery
【发布时间】:2015-01-18 19:12:04
【问题描述】:

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


    【解决方案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]

    【讨论】:

      【解决方案2】:

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

      只有一行:

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

      Fiddle

      【讨论】:

        【解决方案3】:

        试试这个

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

        【讨论】:

          【解决方案4】:

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

          LINQ 的 JavaScript 实现在这里可以派上用场。查看 LinqJS:

          http://linqjs.codeplex.com/

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

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

          【讨论】:

          • 问题是关于数组的简单逐行乘法,而不是关于 SQL 的两个数组的笛卡尔积。
          • 这里是 SQL 的两个数组的乘积示例:jsfiddle.net/3trpj4nw/3 它给出了 9(3×3)个元素数组而不是 3,但是没有用于 JOIN 操作的键。
          • 我完全误解了这个问题——我很抱歉 :)
          • 过失!我错过了问题中的“名称”关键字段。我刚刚发布了另一个纯 JS 和 SQL 答案的答案。而且,毫无疑问,它可以使用 LINQ 库来完成。再次抱歉!
          【解决方案5】:

          您可以通过多种方式做到这一点:

          选项 1:纯 JavaScript 嵌套循环 你可以用纯 JavaScript 来做这件事,只需要两个嵌套循环。它在大数组上相对较慢,但非常简单。

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2016-07-21
            • 1970-01-01
            • 2019-07-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多