首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript -查找所有组合,包括单独组合和双重组合?

JavaScript -查找所有组合,包括单独组合和双重组合?
EN

Stack Overflow用户
提问于 2020-05-03 23:11:03
回答 2查看 38关注 0票数 1

我有一个对象数组,我试图找到它的所有组合。我有一些代码可以找到所有的组合,但是它只根据输入数组的长度找到组合的数量。

例如,如果我使用下面的数组,并使用下面的函数,我得到了27个可能的组合,但是这不包括元素本身或两个元素。

代码语言:javascript
复制
[
[{ optionName: "red" },{ optionName: "blue"  },{ optionName: "green" }],
[{ optionName: "S" },{ optionName: "L" },{ optionName: "XL" }],
[{ optionName: "spotted" },{ optionName: "striped" },{ optionName: "lined" }],
]

例如,我得到的组合如下所示:

代码语言:javascript
复制
[{ optionName: "red" },{ optionName: "L"  },{ optionName: "spotted" }]
[{ optionName: "red" },{ optionName: "S"  },{ optionName: "spotted" }]
[{ optionName: "red" },{ optionName: "S"  },{ optionName: "lined" }]

但是,我还想包含以下组合:

代码语言:javascript
复制
[{ optionName: "red" }]
[{ optionName: "red" },{ optionName: "S"  }]
[{ optionName: "red" },{ optionName: "L"  }]

这是我正在使用的代码:

代码语言:javascript
复制
       var r = [],
        arg = arrayCombOptions,
        max = arg.length - 1;
      function helper(arr, i) {
        for (var j = 0, l = arg[i].length; j < l; j++) {
          var a = arr.slice(0);
          a.push(arg[i][j]);
          if (i == max) r.push(a);
          else helper(a, i + 1);
        }
      }
      helper([], 0);

如何找到所有组合,包括单独组合和双重组合?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-03 23:19:40

您可以为每个内部数组添加一个像undefined这样的虚拟对象,生成一个笛卡尔乘积,只映射没有undefined的数组,并从1开始对数组进行切片,因为第一个数组也是空的。

代码语言:javascript
复制
var data = [[{ optionName: "red" }, { optionName: "blue" }, { optionName: "green" }], [{ optionName: "S" }, { optionName: "L" }, { optionName: "XL" }], [{ optionName: "spotted" }, { optionName: "striped" }, { optionName: "lined" }]], 
    result = data
        .map(a => [undefined, ...a])
        .reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []))
        .map(a => a.filter(Boolean))
        .slice(1);

console.log(result.length);
document.getElementById('out').innerHTML = JSON.stringify(result, null, 4);
代码语言:javascript
复制
<pre id="out"><pre>

票数 2
EN

Stack Overflow用户

发布于 2020-05-04 00:04:40

一个干净而简单的解决方案:您需要迭代数组的数组,并为每个单独的数组找到所有的可能性。

代码语言:javascript
复制
const addToEach = (element, arr) => [...arr, element];

const getAllPossibilitesForSingleArr = (arr) => {
  let r = [];
  for(let i=0;i<arr.length;i++) {
    const combinationsSoFarWithNewElementAdded = r.map(ar => addToEach(arr[i],ar))
    r.push(...combinationsSoFarWithNewElementAdded, [arr[i]]);
  }
 return r;
};


const getAllPossibilitesForArrays = arrays => arrays.map(getAllPossibilitesForSingleArr);

为了在一个数组中找到我迭代过的数组中的所有可能性,在每次迭代中,我用一个新元素扩展结果数组,并用添加的新元素扩展到目前为止的所有组合。

你也可以用纯函数来做这件事(总是更好):

代码语言:javascript
复制
const getAllPossibilitesForSingleArrFunc = (arr) =>
  arr.reduce((acc, curr,i) => {
    const combinationsSoFarWithNewElementAdded = acc.map(ar => addToEach(arr[i],ar))
    return [...acc, [arr[i]], ...combinationsSoFarWithNewElementAdded]
  },[]);

const getAllPossibilitesForArraysFunc = arrays => arrays.map(getAllPossibilitesForSingleArrFunc);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61576758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档