【问题标题】:JavaScript - all the possible combinations from arraysJavaScript - 数组中所有可能的组合
【发布时间】:2017-11-06 19:38:50
【问题描述】:

嘿,我有这个例子:

var arr = [['USA', 'Canada'], ['Food', 'Sports']];

因此预期的结果是:

arr = [
  ['USA', 'Food'],
  ['USA', 'Sports'],
  ['Canada', 'Food'],
  ['Canada', 'Sports']
];

我做错的方式是这样的:

var newArr = [];
$.each(arr[0], function (i, item) {
  $.each(arr[1], function (i, thisItem) {
    newArr.push([item, thisItem]);
  });
});

但是当我向 arr 添加更多项目时,这将无法正常工作。

无论我们有多少层,有什么方法可以递归?

【问题讨论】:

  • 如果您说两个数组,每个数组包含三个项目,那么您的方法当然应该有效。您想到哪些用例会导致代码失败,您能否在问题中说明这一点?
  • 能否分享一个多于1级的输入输出示例
  • Stack sn-p 仅用于运行代码,我刚刚编辑了您的问题。

标签: javascript arrays recursion


【解决方案1】:

这就是所谓的cartesian 产品。

您可以使用ES6 功能来实现此目的:reducemap 方法。

在集合论(以及通常在数学的其他部分)中,一个 笛卡尔积是一种数学运算,它从 多套。

function cartesianProduct(array) {
  return array.reduce((a, b) =>
    a.map(x => b.map(y => x.concat(y)))
    .reduce((a, b) => a.concat(b), []), [[]]);
}
console.log(cartesianProduct([['USA', 'Canada'], ['Food', 'Sports']]));

如果你想传递数组作为参数,只需使用spread syntax

function cartesianProduct(...array) {
      return array.reduce((a, b) =>
        a.map(x => b.map(y => x.concat(y)))
        .reduce((a, b) => a.concat(b), []), [[]]);
}
console.log(cartesianProduct(['USA', 'Canada'], ['Food', 'Sports']));

【讨论】:

  • 有什么办法可以递归
  • @Rajesh 递归不是 OP 的要求。 OP 可能只是说(并使用了标签),因为他认为这将实现他的真正要求,即“无论我们有多少级别”
  • @GerardoFurtado 根据最后的评论,我认为 OP 正在寻找一种递归方法,因为他/她提到了更多级别
  • 这个答案确实涉及更多级别,并且它不是(显式)递归的。
  • 谢谢@Alexandru
猜你喜欢
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多