Как создать все возможные вариации из нескольких многомерных массивов? - PullRequest
0 голосов
/ 03 февраля 2019

Я пробовал разные подходы, в основном, если у меня есть один набор красного и зеленого вариантов, а другой набор размеров, скажем, маленький и большой, мне понадобится следующее:

const input = [{
    label : 'Colours',
    options: [{text : 'red'}, {text : 'green'}]
},{
    label : 'Sizes',
    options: [{text : 'small'}, {text: 'large'}]
}];

Я ожидал бы такой вывод:

red, small,
red, large,
green, small, 
green, large

Ниже приведена более сложная, но похожая структура, которую также можно генерировать из того же кода:

[{"label":"Fitting Options","options":[{"text":"No Thanks","value":"no-thanks","price":0},{"text":"Yes Please (+$110.00 )","value":"yes-please","price":"110.00"}]},{"label":"Memory Card Size","options":[{"text":"128GB (+$180.00 )","value":"128gb","price":"180.00"},{"text":"16GB","value":"16gb","price":0},{"text":"32GB (+$30.00 )","value":"32gb","price":"30.00"},{"text":"64GB (+$80.00 )","value":"64gb","price":"80.00"}]}]

Iиспользовал это как ссылку, но не могу полностью реконструировать это! Получить все варианты из многомерного массива в javascript

1 Ответ

0 голосов
/ 03 февраля 2019

Я просто попытался выяснить алгоритм для этого. Это немного сложно объяснить.Это просто алгоритм комбинаций.
1. Он берет один элемент, а затем объединяет его со всеми остальными.
2. i представляет index of input.j представляет index of options of current obj.Эти значения не изменяются, пока a и b не достигнут конца.

function findComb(arr,result,i,j,a,b){	result.push([arr[i].options[j].text,arr[a].options[b].text]);
	if(arr[a].options[b + 1]) b++;
	else if(arr[a + 1]) a++;
	else{
		if(arr[i].options[j + 1]){
			j++
			a = i + 1
			b = 0
		}
		else if(arr[i + 2]){
			i++;
			j = 0;
			a = i + 1;
            b = 0			
		}
		else return result;
		
	}
	return findComb(arr,result,i,j,a,b)
}


const input1 = [{
    label : 'Colours',
    options: [{text : 'red'}, {text : 'green'}]
},{
    label : 'Sizes',
    options: [{text : 'small'}, {text: 'large'}]
}];
const input2 = [{
    label : 'Colours',
    options: [{text : 'red'}, {text : 'green'},{text:"blue"}]
},{
    label : 'Sizes',
    options: [{text : 'small'}, {text: 'large'},{text: 'medium'}]
}];

console.log(findComb(input1,[],0,0,1,0))
console.log(findComb(input2,[],0,0,1,0))
...