gpt4 book ai didi

javascript - 通过遍历未知数量的数组来创建 JavaScript 对象的笛卡尔积(powerset?)

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:44 26 4
gpt4 key购买 nike

我是初学者,所以如果这是微不足道的,请原谅我的无知。

我有一个未知长度的 javascript 对象,每个属性的值都是一个数组(对我来说也是未知长度)。例如:

var obj = {"varA":[1,2,3],
"varB":['good','bad'],
"varC":[0,100],
"varD":['low','med','high']
}

我想遍历每个属性并为每个属性值组合创建一个新对象。如果我知道我可以强行使用 for 循环的属性数量,但是有没有一种方法可以在不知道有多少循环要硬编码的情况下进行枚举?

我基本上想做这种事情:

var oblist = [];
for (a in varA){
for (b in varB){
for (c in varC){
for (d in varD){
oblist.push({"varA":varA[a], "varB":varB[b], "varC":varC[c], "varD":varD[d]});
}
}
}
}

所以 oblist 将包含如下对象:

{"varA":1, "varB":"good", "varC":0, "varD":"low"}
{"varA":1, "varB":"good", "varC":0, "varD":"med"}
...
{"varA":3, "varB":"bad", "varC":100, "varD":"high"}

谢谢!

编辑:看,我不是在寻求 for-loop 或索引语法帮助。我在问如果我不知道对象中属性的数量该怎么办(例如 varA、varB、varC、varD、varE,我知道我可以拥有 varZZ),所以我不能只是努力-代码 4 for 循环。有没有办法使用 obj[Object.keys(obj)[i]].length 来设置它?

最佳答案

var obj = {"varA":[1,2,3],
"varB":['good','bad'],
"varC":[0,100],
"varD":['low','med','high']
}

// flatten the object into an array so it's easier to work with
var obj2list = function(obj) {
var list = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
list.push({
name: key,
val: obj[key]
});
}
}
return list;
};

// implement your favorite version of clone...this isn't particular fast
var cloneObj = function(obj) {
return JSON.parse(JSON.stringify(obj));
}

var iterateAndPopulateCombo = function(currentObj, listToIterate, result) {
if (listToIterate.length == 0) {
result.push(currentObj);
} else {
listToIterate[0].val.forEach(function(d) {
var newObj = cloneObj(currentObj);
newObj[listToIterate[0].name] = d;
iterateAndPopulateCombo(newObj, listToIterate.slice(1), result);
})
}
}

var list = obj2list(obj);
var result = [];
iterateAndPopulateCombo({}, list, result);
console.log(JSON.stringify(result));
document.body.appendChild(document.createTextNode(JSON.stringify(result)));

关于javascript - 通过遍历未知数量的数组来创建 JavaScript 对象的笛卡尔积(powerset?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27870490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com