首页 > 解决方案 > 获取给定类别和相应值的笛卡尔积

问题描述

let subcatregory = {
  "gender": ["male", "fame"],
  "education": ["matricution", "Inter"],
  "age": ["22", "23"]
}
let category = ['gender', 'education', 'age'];
var values = Dependciesvalues(subcatregory, category)

console.log('result', values)

function Dependciesvalues(Subcate, currentCombinations) {

  let firstCategory = '';
  let firstArray = []
  let temp = [];
  let dependciesvalues = []

  firstCategory = currentCombinations[0];

  for (let property in Subcate) {
    if (property === firstCategory) {
      firstArray = Subcate[property]
    } else {
      
      for (let makeDependencies in firstArray) {
        for (let inner in Subcate[property]) {

         
          
          dependciesvalues.push({
            'values': firstArray[makeDependencies] + ' ' + Subcate[property][inner]
          })
        }
      }
    }
  }
  return dependciesvalues;

}

我有这样的对象

subcatregory={"gender": ["male", "fame"],"education": ["matricution", "Inter"],"age": ["22", "23"]}
Category=['gender','education','age']

我想像这样建立依赖关系

男性->入学-> 22。
男性->入学-> 23。
男性->间-> 22。
男性->间-> 23。
女性-> 入学-> 22。
女性-> 入学-> 23。
女性-> 间-> 22。
女->间->23

这是我的代码

var values= this.Dependciesvalues(subcategories, category)
  console.log(values);

 Dependciesvalues(Subcate,category){
  let firstCategory='';
  let firstArray=[]
  let temp=[];
  let dependciesvalues=[]
  
  firstCategory= category[0];

      for(let property in Subcate){
        if(property===firstCategory){            
          firstArray=Subcate[property]            
        }else{
          console.log('true',firstArray)
          for(let makeDependencies in firstArray ){
                for(let inner in Subcate[property] ){
                
                 temp=Subcate[property][inner]
                 console.log('valesss',  inner)
                  dependciesvalues.push({'values':firstArray[makeDependencies] + ' '+ Subcate[property][inner]})
                }
          }
        }
      }
       return dependciesvalues;

}

我得到这样的输出,这是错误的,你能帮我解决这个问题吗?我真的需要尽快解决这个问题

[ {values: "male matric"}
  {values: "male inter"}
  {values: "female matric"}
  {values: "female inter"} {values: "male 22"}
  {values: "male 23"}
  {values: "female 22"}
  {values: "female 23"}
 ]

标签: javascriptreactjsreact-native

解决方案


看起来您正在寻找3 个类别的笛卡尔积,每个类别有 2 个值。

您可以将可能的组合想象成一个 3 维框,由立方单元组成,其中每个单元(组合)由各自的类别值(坐标)唯一地寻址。

因此,为了获得所有可能的组合,您

  • 将每个维度中的单元格(值)的数量(框的大小,即组合的数量)相乘以准备适当大小的结果数组
  • 逐个单元格地扫描你的盒子,用坐标(组合)填充结果数组:

                               在此处输入图像描述

以下是该方法的现场演示:

const src = {"gender": ["male", "female"],"education": ["matricution", "Inter"],"age": ["22", "23"]},

      
    cartesian = properties => {
      const periods = Object
              .keys(properties)
              .reduce((acc, key, i) => {
                acc[key] = acc.total
                acc.total *= properties[key].length
                return acc
              }, {total:1}),
            result = Array(periods.total)
              .fill()
              .map((_, i) => 
                Object.assign(
                  {},
                  ...Object
                    .keys(properties)
                    .map(key => 
                      ({[key]: properties[key][0|i/periods[key]%properties[key].length]}))
                )
             )
      return result
    }
    
console.log(cartesian(src))
.as-console-wrapper{min-height:100%;}


推荐阅读