2012-03-19 17 views
6

मुझे पहली बार गहराई में पेड़ की संरचना को पार करने में मदद की ज़रूरत है। मैं इसे ठीक से करने के लिए एक एल्गोरिदम के साथ नहीं आ सकता।जावास्क्रिप्ट ट्री ट्रैवर्सल एल्गोरिदम

[ 
    ["A", "B", "C"], 
    ["1", "2"], 
    ["a", "b", "c", "d"] 
] 

उत्पादन रूप में लेना चाहिए:

[ 
    "A/1/a", "A/1/b", "A/1/c", "A/1/d", 
    "A/2/a", "A/2/b", "A/2/c", "A/2/d", 
    "B/1/a", "B/1/b", "B/1/c", "B/1/d", 
    "B/2/a", "B/2/b", "B/2/c", "B/2/d", 
    "C/1/a", "C/1/b", "C/1/c", "C/1/d", 
    "C/2/a", "C/2/b", "C/2/c", "C/2/d" 
] 
+0

यह किया जा सकता है, लेकिन यह एक है थोड़ा मुश्किल क्या कोई तरीका है कि आप अपना डेटा पुनर्गठित कर सकते हैं? आपको 'ए बी सी' का समन्वय करने में परेशानी होगी, जिसमें '1 2' और कौन सा बी बी डी है; आपका अपेक्षित डेटा ऐसा लगता है जैसे यह एक अजीब नियम का पालन करता है। हालांकि, अपेक्षित डेटा देने के लिए +1। – Bojangles

+0

निश्चित रूप से। मैं किसी भी तरह से इनपुट में हेरफेर कर सकते हैं। कौन सा रूप बेहतर होगा? – Adam

+0

सबसे आसान तरीका है कि मैं सोच सकता हूं कि एक भाई सरणी के बजाय बाल सरणी है। पेड़ की तरह संरचना के रूप में पार करना बहुत आसान है। – Bojangles

उत्तर

7

यह काम करना चाहिए:

function traverse(arr) { 
 
    var first = arr[0]; 
 
    var ret = []; 
 
    if (arr.length == 1) { 
 
    for (var i = 0; i < first.length; i++) { 
 
     ret.push(first[i]); 
 
    } 
 
    } else { 
 
    for (var i = 0; i < first.length; i++) { 
 
     var inn = traverse(arr.slice(1)); 
 
     for (var j = 0; j < inn.length; j++) { 
 
     ret.push(first[i] + '/' + inn[j]); 
 
     } 
 
    } 
 
    } 
 
    return ret; 
 
} 
 

 
var inp = [ 
 
    ["A", "B", "C"], 
 
    ["1", "2"], 
 
    ["a", "b", "c", "d"] 
 
]; 
 

 
var out = traverse(inp); 
 

 
console.log(out);

3

क्या आप देख रहे हैं सूचियों की एक सूची की कार्तीय उत्पाद है, यह किया गया है asked

मेरे इनपुट यह है पहले। उस प्रश्न के लिए स्वीकार किए जाते हैं जवाब से उधार, आप जावास्क्रिप्ट 1.7 में यह कर सकते हैं:

function product() { 
    return Array.prototype.reduce.call(arguments, function(as, bs) { 
     return [a.concat(b) for each (a in as) for each (b in bs)]; 
    }, [[]]); 
}; 

function convert(lst) { 
    var solution = []; 
    for (var i = 0; i < lst.length; i++) { 
    solution.push(lst[i][0] + "/" + lst[i][1] + "/" + lst[i][2]); 
    } 
    return solution; 
}; 

convert(product(["A", "B", "C"], ["1", "2"], ["a", "b", "c", "d"])); 

> ["A/1/a", "A/1/b", "A/1/c", "A/1/d", 
    "A/2/a", "A/2/b", "A/2/c", "A/2/d", 
    "B/1/a", "B/1/b", "B/1/c", "B/1/d", 
    "B/2/a", "B/2/b", "B/2/c", "B/2/d", 
    "C/1/a", "C/1/b", "C/1/c", "C/1/d", 
    "C/2/a", "C/2/b", "C/2/c", "C/2/d"] 
+0

मुझे लगता है कि आपको परमालिंक शामिल करना चाहिए, क्योंकि सिद्धांत में वे स्वीकृत उत्तर बदल सकते हैं और 100 उत्तरों अधिक पोस्ट कर सकते हैं (और इसे तब खोजना बहुत कठिन होगा) – ajax333221

+0

@ AJAX333221 सहमत हुए, मैंने आपके द्वारा सुझाए गए परमालिंक को जोड़ा। –

+1

यह अधिक सुरुचिपूर्ण और अधिक सामान्यीकृत है, लेकिन यह विशिष्ट समस्या का समाधान नहीं करता है और वर्तमान संस्करण में एक त्रुटि है। – Adam

संबंधित मुद्दे