首页 > 解决方案 > 将 3 层数组映射到对象集合

问题描述

我正在努力获得 3 层数组分组以正确映射到单个对象集合,其中每一层作为对象的键名,数组值作为键值。

这三个数组按层相互关联,结构如下:

{
  tier1: ['tier1-item1', 'tier1-item2'],
  tier2: ['tier2-item1', 'tier2-item2', 'tier2-item3', 'tier2-item4', 'tier2-item5'],
  tier3: ['tier3-item1', 'tier3-item2', 'tier3-item3']
}

它们需要产生如下的对象数组:

[
  {tier1: "tier1-item1", tier2: "tier2-item1", tier3: "tier3-item1"},
  {tier1: "tier1-item1", tier2: "tier2-item2", tier3: "tier3-item1"},
  {tier1: "tier1-item1", tier2: "tier2-item3", tier3: "tier3-item1"},
  {tier1: "tier1-item1", tier2: "tier2-item4", tier3: "tier3-item1"},
  {tier1: "tier1-item1", tier2: "tier2-item5", tier3: "tier3-item1"},

  {tier1: "tier1-item2", tier2: "tier2-item1", tier3: "tier3-item1"},
  {tier1: "tier1-item2", tier2: "tier2-item2", tier3: "tier3-item1"},
  {tier1: "tier1-item2", tier2: "tier2-item3", tier3: "tier3-item1"},
  {tier1: "tier1-item2", tier2: "tier2-item4", tier3: "tier3-item1"},
  {tier1: "tier1-item2", tier2: "tier2-item5", tier3: "tier3-item1"},

  {tier1: "tier1-item1", tier2: "tier2-item1", tier3: "tier3-item2"},
  {tier1: "tier1-item1", tier2: "tier2-item2", tier3: "tier3-item2"},
  {tier1: "tier1-item1", tier2: "tier2-item3", tier3: "tier3-item2"},
  {tier1: "tier1-item1", tier2: "tier2-item4", tier3: "tier3-item2"},
  {tier1: "tier1-item1", tier2: "tier2-item5", tier3: "tier3-item2"},

  {tier1: "tier1-item2", tier2: "tier2-item1", tier3: "tier3-item2"},
  {tier1: "tier1-item2", tier2: "tier2-item2", tier3: "tier3-item2"},
  {tier1: "tier1-item2", tier2: "tier2-item3", tier3: "tier3-item2"},
  {tier1: "tier1-item2", tier2: "tier2-item4", tier3: "tier3-item2"},
  {tier1: "tier1-item2", tier2: "tier2-item5", tier3: "tier3-item2"},

  {tier1: "tier1-item1", tier2: "tier2-item1", tier3: "tier3-item3"},
  {tier1: "tier1-item1", tier2: "tier2-item2", tier3: "tier3-item3"},
  {tier1: "tier1-item1", tier2: "tier2-item3", tier3: "tier3-item3"},
  {tier1: "tier1-item1", tier2: "tier2-item4", tier3: "tier3-item3"},
  {tier1: "tier1-item1", tier2: "tier2-item5", tier3: "tier3-item3"},

  {tier1: "tier1-item2", tier2: "tier2-item1", tier3: "tier3-item3"},
  {tier1: "tier1-item2", tier2: "tier2-item2", tier3: "tier3-item3"},
  {tier1: "tier1-item2", tier2: "tier2-item3", tier3: "tier3-item3"},
  {tier1: "tier1-item2", tier2: "tier2-item4", tier3: "tier3-item3"},
  {tier1: "tier1-item2", tier2: "tier2-item5", tier3: "tier3-item3"},
]

所以所有可能的项目组合都有一个对象。

我不一定要寻找代码示例,尽管它们很受欢迎,但更多的是朝着正确方向 es5+ 的概念推动。

标签: javascript

解决方案


您需要一个简单的嵌套循环,如下所示:

function(input) {
  let arr = [];
  for (let i = 0; i < input["tier1"].length; i++) {
    for (let j = 0; j < input["tier2"].length; j++) {
      for (let k = 0; k < input["tier3"].length; k++) {
        let obj = {
          tier1: input["tier1"][i],
          tier2: input["tier2"][j],
          tier3: input["tier3"][k]
        };
        arr.push(obj);
      }
    }
  }
  return arr;
}

对于 n 层的通用解决方案,我们可以在不嵌套的情况下进行如下操作:

function allCombinations(input) {
  let result = [];
  (function recurse(input, n, outObject, outputArray) {
    if (n > Object.keys(input).length) { 
      outputArray.push(outObject);
      return;
    }
    let str = "tier" + n;
    for (let i = 0; i < input[str].length; i++) {
      let obj = Object.assign({}, outObject);
      obj[str] = input[str][i];
      recurse(input, n+1, obj, outputArray);
    }
  })(input, 1, {}, result);
  return result;
}

基本上,我们选择一个层的每个元素,将其克隆并递归到下一层,直到我们到达终点。


推荐阅读