我有一个包含HTML类的数组对象:
var myObj = {
classes1: ['.classI'],
classes2: ['.classA', '.classB'],
classes3: ['.class1', '.class2', '.class3'],
}
我希望能够将它们加入到这样的字符串中:
".classI.classA.class1, .classI.classA.class2, .classI.classA.class3, .classI.classB.class1, .classI.classB.class2, .classI.classB.class3"
有没有办法迭代对象中的每个数组并组合上面的元素?
提前致谢。
答案 0 :(得分:4)
使用嵌套循环。
var myObj = {
classes1: ['.classI'],
classes2: ['.classA', '.classB'],
classes3: ['.class1', '.class2', '.class3'],
}
var result_array = [];
myObj.classes1.forEach(function(s1) {
myObj.classes2.forEach(function(s2) {
myObj.classes3.forEach(function(s3) {
result_array.push(s1 + s2 + s3);
});
});
});
var result = result_array.join(', ');
console.log(result);

答案 1 :(得分:1)
有点奇怪,你从一个带有classesX
等编号属性的对象开始,X
是一个增量编号。出于这样的目的,数组是更直观的选择:
var myArr = [
['.classI'],
['.classA', '.classB'],
['.class1', '.class2', '.class3']
];
所以我建议先从这样的数组开始。否则,使用此ES6代码将其首先转换为一个:
var myArr = Object.keys(myObj).map(k => myObj[k]);
注意:使用ES.Next(它在ES2017 draft中)你可以将上面的内容写成:
var myArr = Object.values(myObj);
然后你可以使用这个ES6函数来获得你想要的结果,但是在数组结构中:
function cartesianConcat (a) {
return a.reduce((b, c) => b.reduce((d, s) => d.concat(c.map( t => s + t )), []));
}
// sample data (in plain object form):
var myObj = {
classes1: ['.classI'],
classes2: ['.classA', '.classB'],
classes3: ['.class1', '.class2', '.class3'],
};
// Object should really be an array:
var arr = Object.keys(myObj).map(k => myObj[k]);
// Get result and output as comma-separated string:
console.log(cartesianConcat(arr).join(', '));

最终join(', ')
将结果转换为您需要的一个字符串输出。
请注意,如果输入中有更多(或更少)级别,此解决方案将继续有效。
答案 2 :(得分:0)
这是我对问题的递归解决方案。
ba_turista
答案 3 :(得分:0)
我意识到已经有了一个很好的答案。在我意识到之前,我正在做自己的事情,但为了完成这个允许你以任何顺序放入数组并且是一个函数,这意味着如果你必须使用几个不同的数组这样做,这应该允许你可以用更少的代码来完成它。
它创建了一个名为pyramidArrange的函数,当你传递三个数组时,它首先对它们进行排序,然后执行计算,返回所有值的Set Object
。您可以将Set Object视为一个数组,只允许存储在其中的每个值中的一个。它还使您能够使用SetObj.has(value)
var myObj = {
classes2: ['.classI'],
classes1: ['.classA', '.classB'],
classes3: ['.class1', '.class2', '.class3'],
}
FirstArray = myObj.classes1;
SecondArray = myObj.classes2;
ThirdArray = myObj.classes3;
pyramidArrange(FirstArray, SecondArray, ThirdArray);
function pyramidArrange(firstArr, secondArr, thirdArr) {
var ourSet = new Set();
var ourArrays = [{
array: firstArr,
length: firstArr.length
}, {
array: secondArr,
length: secondArr.length
}, {
array: thirdArr,
length: thirdArr.length
}];
ourArrays.sort(function(a, b) {
return a.length - b.length;
});
for (let val of ourArrays[0].array) {
for (let val2 of ourArrays[1].array) {
for (let val3 of ourArrays[2].array) {
ourSet.add(val + val2 + val3);
}
}
}
return ourSet;
}