将多个数组的值组合成字符串

时间:2016-10-14 00:08:58

标签: javascript jquery arrays object

我有一个包含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"

有没有办法迭代对象中的每个数组并组合上面的元素?

提前致谢。

4 个答案:

答案 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)

JS Fiddle

我意识到已经有了一个很好的答案。在我意识到之前,我正在做自己的事情,但为了完成这个允许你以任何顺序放入数组并且是一个函数,这意味着如果你必须使用几个不同的数组这样做,这应该允许你可以用更少的代码来完成它。

它创建了一个名为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;
}