javascript - 获取给定类别和相应值的笛卡尔积
问题描述
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"}
]
解决方案
看起来您正在寻找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%;}
推荐阅读
- c - task_struct -> parent 总是指向根进程而不是实际的父进程
- spring-security-oauth2 - Zuul 网关未携带授权标头
- php - 如何在创建方法 laravel6 后重定向用户?
- batch-file - 批处理文件findstr,如何?
- html - How to merge two forms into one?
- c# - 为什么 SQL Server XML 数据类型会在插入和检索时更改数字签名块中特定属性的顺序?
- c# - Swagger C# 枚举生成 - 基础 int 值与原始枚举不匹配
- c# - 无法在 xamarin android 中覆盖 AttachBaseContext()
- android - Xamarin Android 海关状态升级到 Visual Studio 2019 后无法正常工作
- android - 存储到firebase数据库后如何禁用其他人的复选框值?