簡體   English   中英

循環遍歷數組中數組中的值。 輸出所有組合

[英]Loop through values in arrays in an array. Output all combinations

我有一個對象。 我想遍歷它的一個屬性:它本身是一個包含值的數組數組。 對於這些值中的每一個,我想輸出一個包含來自每個子數組的代表值的數組,以便輸出每個可能的值組合。 如果子數組中有多個值,則一次最多允許有 1 個值。 在這一點上,我認為它應該“跳到”下一個(並對所有其他人做同樣的事情),但我不確定如何。 結果應如下所示:

RABBIT: GREY, FURRY, BOUNCES, CUTE

RABBIT: WHITE, FURRY, BOUNCES, CUTE

RABBIT: RED, FURRY, BOUNCES, CUTE

RABBIT: GREY, FURRY, SCAMPERS, CUTE

RABBIT: WHITE, FURRY, SCAMPERS, CUTE

RABBIT: RED, FURRY, SCAMPERS, CUTE

數組(及其子數組)的長度未知,因此我使用了 for 循環。 這是到目前為止的代碼:

window.onload = function (){
var myObject = {
        name: 'RABBIT',
        arrayOfValues : [
            ['GREY','WHITE','RED'],
            ['FURRY'],
            ['BOUNCES', 'SCAMPERS'],
            ['CUTE']
        ]
    };

var results = [];
for (i=0;i<myObject.arrayOfValues.length;i++){
    for (j=0; j<myObject.arrayOfValues[i].length;j++){
        if(myObject.arrayOfValues[i].length>1) {
            var currentProperty = myObject.arrayOfValues[i][j];
            myFunc();
        }
        else {
            var currentProperty = myObject.arrayOfValues[i][0];
            myFunc();
        };
    };
};

function myFunc(){
    results = results.concat(currentProperty);
    if (results.length == myObject.arrayOfValues.length){
    var finalResults = myObject.name + ': ' + results
    console.log(finalResults);
    };
};
};

PS - 數據的形式不是一成不變的,我只是為了方便起見使用了一個對象。

謝謝,保羅

您可以使用遞增的索引參數進行遞歸函數調用,以及將字符串的新部分附加到字符串並返回的字符串。

 var arrayOfArrays = [ ['big', 'red'], ['red', 'yellow', 'blue'], ['dog', 'cat'] ]; var strings = []; function eachStep(string_so_far, array_index) { if (array_index < arrayOfArrays.length) { for (var i = 0; i < arrayOfArrays[array_index].length; i++) { var string_for_this_step = string_so_far + arrayOfArrays[array_index][i] + " "; var string_returned = eachStep(string_for_this_step, array_index+1); if (string_returned !== "") { strings.push(string_returned); } } return ""; } else { return string_so_far; } } eachStep("", 0); console.log(strings);

遞歸是這里的原生解決方案:

// Object as described by question:
var myObject = {
    name: 'RABBIT',
    arrayOfValues: [
        ['GREY', 'WHITE', 'RED'],
        ['FURRY'],
        ['BOUNCES', 'SCAMPERS'],
        ['CUTE']
    ]
};

function permutations(arrays, current_array, idx, results) {
    // Init head and results in case this is the first iteration:
    idx = idx || 0;
    results = results || [];
    current_array = current_array || [];
    // If there's nothing more to add:
    if (arrays.length == idx) {
        results.push(current_array);
        return;
    }
    // Otherwise, iterate current level and concat values, while calling next level:
    arrays[idx].forEach(function(subArrayItem) {
        permutations(arrays, current_array.concat(subArrayItem), idx + 1, results)
    });
    return results;
}

上面的函數將返回一組具有所有組合的數組,接下來是一個用於打印的輔助函數:

// Helper method to print resulting arrays:
function print(obj) {
    var separator = "\n"
    var prefix = obj.name + ": ";
    // Joins the resulting sets with the prefix, and returns printable string:
    return prefix + permutations(obj.arrayOfValues).join(separator + prefix)
}

console.log(print(myObject));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM