【问题标题】:Why does my JavaScript function accept three arrays, but not an array containing three arrays?为什么我的 JavaScript 函数接受三个数组,而不接受包含三个数组的数组?
【发布时间】:2012-02-21 21:50:45
【问题描述】:
function product() {
    return Array.prototype.reduce.call(arguments, function(as, bs) {
        return [a.concat(b) for each (a in as) for each (b in bs)]
    }, [[]]);
}


arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']];
alert(product(['4','4A','4B'],['16D','15D'],['5d','5e']);

上述方法有效,但以下方法无效:

arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']];
alert(product(arr4);

感谢您的建议

【问题讨论】:

  • [a.concat(b) for each (a in as) for each (b in bs)]是什么语法?你确定你使用的是 JavaScript,而不是 Python?
  • @Rocket: for each (.. in ..) 是 Mozilla 支持的 JavaScript 扩展,目前不属于 ECMAScript 标准(只是该标准的一部分),因此可能不支持非Mozilla 浏览器,例如 Chrome 或 Internet Explorer 或 Safari。我会警告不要使用它。这是实际上非常好的风格,但是应该使用[].map[].forEach[].filter[].reduce 等,它们 符合标准并且广泛支持。 (如果您不喜欢使用这些,请使用 jQuery 的稍有损坏的 $.each$.map。)

标签: javascript product cartesian


【解决方案1】:

您可以选择其中一个;否则定义不明确。 (除非您想做出非常可疑的决定来执行特殊情况,例如“如果我的第一个参数是一个数组并且每个元素都是一个数组,则返回不同的东西”。那么您将立即重新制作 PHP。=])


改用somefunction.apply 方法;这就是它的目的。例如:

product.apply(this, arr4)

相当于:

product(arr4[0], arr4[1], ...)

如果你经常这样做,你可以定义product2(arrays) {return product.apply(this,arrays)}


但是,除非您想两者都 product([..], [..], ..)product([[..],[..],..]),否则这似乎不优雅。

如果您希望此函数在默认情况下表现得像product([[..],[..],..]),那么解决此问题的正确方法是修改函数以满足您的需要。它目前使用默认的“可变参数”(多个参数)arguments javascript 专用变量,它代表一个数组,表示您传递给函数的所有参数。如果您想要普通样式的固定参数数量函数,这不是您想要的。首先添加适当的参数:

function product(arrays) {
    ...
}

不要使用默认的arguments 变量,而是将其替换为arrays

【讨论】:

  • 哇,这很管用!非常感谢
猜你喜欢
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2020-06-25
  • 1970-01-01
  • 2023-03-07
  • 2020-03-31
  • 2017-10-21
相关资源
最近更新 更多