[英]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.