【问题标题】:Compute cartesian product of elements in 1 array计算 1 个数组中元素的笛卡尔积
【发布时间】:2016-03-02 10:34:20
【问题描述】:

我想计算数组单个元素内的笛卡尔积。一次只能有 2 个值。
所以如果这是我的数组:

[["cat dog mouse"], ["blue red green"]]

期望值为:

  • 猫,狗
  • 猫、老鼠
  • 狗,老鼠
  • 蓝色,红色
  • 蓝色,绿色
  • 红、绿

这是我的错误方法:

var arr = [["cat dog mouse"], ["blue red green"], ["apple orange banana"]];

for (i = 0; i < arr.length; i++) {
    for(j = 0; j < arr[i].length; j++){
        if(j >= arr[i].length){
            console.log(arr[i][j].split( " ")  + " "  + arr[i][0])
        }else{
            console.log(arr[i][j].split( " ")  + " "  + arr[i][j+1])
        }
    }
}

它给了我

  • 猫、狗、鼠标未定义
  • 蓝色、红色、绿色未定义

【问题讨论】:

    标签: javascript arrays cartesian-product


    【解决方案1】:

    你可以使用 split()for 循环来做这样的事情

    var arr = [
      ["cat dog mouse"],
      ["blue red green"],
      ["apple orange banana"]
    ];
    
    // iterate the array
    for (i = 0; i < arr.length; i++) {
      // split the string 
      var inArr = arr[i][0].split(' ');
      // iterate the splitted string  array
      for (j = 0; j < inArr.length - 1; j++) {
        // iterate string next to current string
        for (k = j + 1; k < inArr.length; k++)
          // generate the output
          console.log(inArr[j] + ', ' + inArr[k]);
      }
    }

    【讨论】:

      【解决方案2】:
      [["cat dog mouse"], ["blue red green"]].forEach(function (item) {
          item.forEach(function (value) {
               var arr = value.split(' ');
               var hash = {};
               arr.forEach(function (firstItem) {
                    arr.forEach(function (secondItem) {
                        if (firstItem !== secondItem && !hash[firstItem + secondItem] && !hash[secondItem + firstItem]) {
                            console.log(firstItem + ', ' + secondItem);
                            hash[firstItem+secondItem] = true;
                        }
                    });
               })
          });
      });
      

      【讨论】:

        【解决方案3】:

        你很接近,一些修改过的代码

        var arr = [["cat dog mouse"], ["blue red green"], ["apple orange banana"]];
        
        for (i = 0; i < arr.length; i++) {
            var items = arr[i][0].split(" ")
            for (j = 0; j < items.length - 1; j++) {
                for (k = j+1; k < items.length; k++) {
                    console.log(items[j], items[k])
                }
            }
        }
        

        结果:

        cat dog
        cat mouse
        dog mouse
        blue red
        blue green
        red green
        apple orange
        apple banana
        orange banana
        

        【讨论】:

          【解决方案4】:

          你可以用函数式的方式,只需使用.map().forEach()方法:

          var arr = [["cat dog mouse"], ["blue red green"], ["apple orange banana"]];
          
          
          function print(item){
            //If there is one last item we stop the process
            if (item.length <= 1) return;
            else {
              //Retrieve head of our stack and shift the first item
              const head = item.shift();
              item.forEach((elm) => console.log(head + ',' + elm));
              // call our recursive function with the new array
              return print(item);
            }
          }
          
          function combine(arr){
            //Return array splited by using .map and .split operations, then iterate by using forEach and call our
            // recursive function
            arr
              .map((array) => array[0].split(' '))
              .forEach((value) => print(value));
          }
          
          combine(arr);
          

          您可以查看Plunker

          【讨论】:

            【解决方案5】:

            一个解决方案拆分为部分解决方案,一个用于数组,一个用于组合,不重复。

            function combine(array, length) {
                function c(l, r) {
                    var ll = l.slice();
                        if (r.length === length) {
                        result.push(r);
                        return;
                    }
                    while (ll.length) {
                        c(ll, r.concat(ll.shift()));
                    }
                }
                var result = [];
                c(array, []);
                return result;
            }
            
            function get(array) {
                return array.map(function (a) {
                    return combine(a[0].split(' '), 2);
                });
            }
            
            var result = get([["cat dog mouse"], ["blue red green"], ["apple orange banana"]]);
            document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

            【讨论】:

              猜你喜欢
              • 2011-03-24
              • 2017-03-07
              • 2021-11-19
              • 1970-01-01
              • 2013-04-20
              • 2017-03-05
              • 2011-12-18
              • 2011-01-31
              相关资源
              最近更新 更多