在尊重订单的同时递归构建所有可能组合的JavaScript数组

时间:2014-07-28 09:16:57

标签: javascript arrays recursion

我很难在代码中获得以下概念:

假设我们得到以下数组:

[
    'h1,h2',
    'span,style'
]

由此我希望得到以下输出:

[
    'h1 span',
    'h1 style',
    'h2 span',
    'h2 style
]

因此我们有一个字符串数组,其中包含原始数组的所有组合,这些组合也遵循顺序(因此span h1style h2无效)。

描述详细:我有一个单级的字符串数组,它们实际上是逗号分隔的值。我希望迭代这个数组并将这些字符串用逗号分隔到一个新数组中,并为这个新数组中的每个索引构建一个新字符串,其中包含原始数组中后续索引的所有其他分割值。

我在尝试使用JavaScript编程时遇到了困难。我知道我需要一些递归,但我很困惑如何做到这一点。在尝试了各种不同的和失败的方法之后,我现在有了这个:

function mergeTagSegments(arr, i, s) {

    i = i || 0;
    s = s || '';

    if(!arr[i]) { return s; }

    var spl = arr[i].split(',');
    for(var j in spl) {
        s += spl[j] + mergeTagSegments(arr, i+1, s);
    }

    return s;

}

这也无法按预期工作。

我感到有点尴尬,我无法完成我原先认为的这么简单的任务。但我真的希望从中吸取教训。

非常感谢您的建议和提示。

1 个答案:

答案 0 :(得分:1)

你的想法是正确的。递归肯定是要走的路。我在下面实现了一个建议的解决方案,它可以为您提供所需的输出。

var values = ['h1,h2', 'span,style'];

function merge(input, index) {
    var nextIndex = index + 1;
    var outputArray = [];
    var currentArray = [];

    if(index < input.length) {
        currentArray = input[index].split(',');
    }

    for(var i = 0, end = currentArray.length; i < end; i++) {               
        if(nextIndex < input.length) {
            merge(input, nextIndex).forEach(function(item) {
                outputArray.push(currentArray[i] + ' ' + item);
            });
        }
        else {
            outputArray.push(currentArray[i]);
        }
    }

    return outputArray;
}

var output = merge(values, 0, '');
console.log(output);