【问题标题】:Cartesian product of an unknown amount of arrays/objects WITH label identifiers带有标签标识符的未知数量的数组/对象的笛卡尔积
【发布时间】:2021-12-08 23:51:33
【问题描述】:

好的,我知道有一些帖子是关于获取未知数量的元素数量未知的数组的乘积 -

JavaScript - Generating combinations from n arrays with m elements

Cartesian array based on array of objects in Javascript

仅举几例 - 但是,我需要稍微改变一下 -

我想要的是一个可以输出序列化对象数组而不是数组数组的函数..

例如,如果函数的输入是 -

scenarioBuilder({ENV: ["QA","UAT"], HOST: ["APP1", "APP2", "APP3"], API: ["Example1", "Example2"]})

输出将是一个这样的序列化对象数组 -

[{ENV: "QA", HOST: "APP1", API: "Example1"}, 
{ENV: "UAT", HOST: "APP1", API: "Example1"},
{ENV: "QA", HOST: "APP2", API: "Example1"},
{ENV: "UAT", HOST: "APP2", API: "Example1"},
{ENV: "QA", HOST: "APP3", API: "Example1"},
{ENV: "UAT", HOST: "APP3", API: "Example1"}]

等等。等等等等。

基本上采用 ENV、HOSTS 和 API 的数组 - 并制作一个序列化的场景构建器。

我尝试了一些技巧来适应上述链接中的一些方法,但我没有运气。

具体来说-

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

但 Javascript 不是我的主要语言,老实说,我不知道如何分解数组并重新组装对象。

有人可以试一试吗?

一如既往的感谢。

【问题讨论】:

  • StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 您的“尝试”似乎与您想要的完全不符。您的函数参数是单个对象。您可以使用Object.entries() 从中获取键和值数组。
  • 您的输出应该是一个对象数组,但您的代码中没有任何地方尝试创建任何对象。
  • 代码太远了,无法更正它——我们只能从头开始为您编写整个代码。

标签: javascript arrays


【解决方案1】:

这只是一个递归问题......

const data = 
  { ENV : [ 'QA', 'UAT' ] 
  , HOST: [ 'APP1', 'APP2', 'APP3' ] 
  , API : [ 'Example1', 'Example2' ] 
  } 
 
const scenarioBuilder = objXarr =>
  {
  let names = Object.keys( objXarr )
    , len   = names.length -1
    , resp  = []
    ;
  buildIn( {}, 0)
  return resp

  function buildIn(obj, indx)
    {
    let key = names[indx]
    for (let val of objXarr[ key ] )
      {
      let oo = {...obj,[key]:val}
      if (indx < len )  buildIn(oo, indx +1)
      else resp.push( oo )
      }
    }
  }

console.log( scenarioBuilder( data ) )
.as-console-wrapper {max-height: 100%!important;top:0 }

【讨论】:

  • 好人-谢谢
猜你喜欢
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2017-03-05
  • 2011-12-18
  • 2011-01-31
相关资源
最近更新 更多