-2

я взял js-combinatorics код и производится следующим образом:декартово произведение многомерного массива

(function(global) { 
    'use strict'; 
    if (global.Combinatorics) return; 
    /* common methods */ 
    var addProperties = function(dst, src) { 
     Object.keys(src).forEach(function(p) { 
      Object.defineProperty(dst, p, { 
       value: src[p] 
      }); 
     }); 
    }; 
    var hideProperty = function(o, p) { 
     Object.defineProperty(o, p, { 
      writable: true 
     }); 
    }; 
    var toArray = function(f) { 
     var e, result = []; 
     this.init(); 
     while (e = this.next()) result.push(f ? f(e) : e); 
     this.init(); 
     return result; 
    }; 
    var common = { 
     toArray: toArray, 
     map: toArray, 
     forEach: function(f) { 
      var e; 
      this.init(); 
      while (e = this.next()) f(e); 
      this.init(); 
     }, 
     filter: function(f) { 
      var e, result = []; 
      this.init(); 
      while (e = this.next()) if (f(e)) result.push(e); 
      this.init(); 
      return result; 
     } 

    }; 
    /* Cartesian Product */ 
    var arraySlice = Array.prototype.slice; 
    var cartesianProduct = function() { 
     if (!arguments.length) throw new RangeError; 
     var args = arraySlice.call(arguments); 
     args = args[0]; 
     console.log(args); 
     var 
      size = args.reduce(function(p, a) { 
       return p * a.length; 
      }, 1), 
      sizeOf = function() { 
       return size; 
      }, 
      dim = args.length, 
      that = Object.create(args, { 
       length: { 
        get: sizeOf 
       } 
      }); 
     if (!size) throw new RangeError; 
     hideProperty(that, 'index'); 
     addProperties(that, { 
      valueOf: sizeOf, 
      dim: dim, 
      init: function() { 
       this.index = 0; 
      }, 
      get: function() { 
       if (arguments.length !== this.length) return; 
       var result = []; 
       arguments.forEach(function(element,index,array) { 
        var i = arguments[index]; 
        if(i >= this[index].length) return; 
        result.push(this[index][i]); 
       }); 
       return result; 
      }, 
      nth: function(n) { 
       var result = []; 
       arguments.forEach(function(element,index,array) { 
        var l = this[index].length, 
         i = n % l; 
        result.push(this[index][i]); 
        n -= i; 
        n /= l; 
       }); 
       return result; 
      }, 
      next: function() { 
       if (this.index >= size) return; 
       var result = this.nth(this.index); 
       this.index++; 
       return result; 
      } 
     }); 
     addProperties(that, common); 
     that.init(); 
     return that; 
    }; 

    /* export */ 
    addProperties(global.Combinatorics = Object.create(null), { 
     cartesianProduct: cartesianProduct 
    }); 
})(this); 

var _ = []; 
_[1] = [1,4]; 
_[7] = [2,9]; 

cp = Combinatorics.cartesianProduct(_); 
console.log(cp.toArray()); 

Я ожидаю, чтобы получить этот результат в конце:

[[1,2],[1,9],[4,2],[4,9]] 

Но продолжать получать Uncaught TypeError: undefined is not a function в Chrome и TypeError: arguments.forEach is not a function в Firefox каждый раз, когда я использую forEach в этой части кода:

nth: function(n) { 
    var result = []; 
    arguments.forEach(function(element,index,array) { 
     var l = this[index].length, 
      i = n % l; 
     result.push(this[index][i]); 
     n -= i; 
     n /= l; 
    }); 
    return result; 
} 

Сохранение индексов массива _ является обязательным.

+1

я действительно интересно, что вы там делаете учитывая, что [декартовы функция продукта довольно просто] (http://stackoverflow.com/a/15310051/1048572) – Bergi

+0

@Bergi thanx для подсказки –

ответ

0

мне нужно разместить _ массив с нестрогой индексацией:

var _ = []; 
_[1] = [1,4]; 
_[7] = [2,9]; 

по умолчанию решения В не являются не идти, потому что они не обрабатывают такие массивы. Так что мне пришлось подправить идея Bergi «s найдено here:

function cartesian(arg) { 
    var r = [], max = arg.length-1; 
    function helper(arr, i) { 
     while(typeof arg[i] === "undefined") { 
      i += 1; 
     } 
     for (var j=0, l=arg[i].length; j<l; j++) { 
      var a = arr.slice(0); // clone arr 
      a.push(arg[i][j]); 
      if (i==max) { 
       r.push(a); 
      } else 
       helper(a, i+1); 
     } 
    } 
    helper([], 0); 
    return r; 
} 
0

arguments не является массивом, поэтому он не имеет метода forEach.

Вы можете преобразовать его в массив так же, как вы делали в var args = arraySlice.call(arguments);, или вы используете цикл for для итерации по его элементам.

+0

кажется, что вы только прокручивали вопрос, не читая его. –

+0

Пока мы принимаем вещи: вы на самом деле не задавали никаких вопросов, поэтому я предположил, что это ошибка, которую вы получаете. –

Смежные вопросы