Алгоритм обхода дерева Javascript

Мне нужна помощь в прохождении древовидной структуры. Я не могу придумать алгоритм, чтобы сделать это правильно.

Мой вклад это:

[
    ["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"
]
 Bojangles19 мар. 2012 г., 01:39
Это можно сделать, но это немного сложно. Есть ли способ реорганизовать ваши данные? Вы будете иметь проблемы с координацией, какой изA B C соответствует которому1 2 и которыйa b c d; Ваши ожидаемые данные выглядят так, как будто они следуют довольно странному правилу. +1 за предоставление ожидаемых данных, хотя.
 Bojangles19 мар. 2012 г., 01:45
Самый простой способ, который я могу придумать, это иметь дочерний массив вместо одноуровневого массива. Это намного легче пройти как древовидную структуру.
 Adam19 мар. 2012 г., 01:42
Конечно. Я могу манипулировать вводом любым способом. Какая форма будет предпочтительнее?

Ответы на вопрос(2)

Решение Вопроса

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);

что вы ищете, это декартово произведение списка, это былоспросил до. Заимствуя принятый ответ на этот вопрос, вы можете сделать это в Javascript 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"]
 Óscar López19 мар. 2012 г., 02:29
@ Adam Я только что обновил свой ответ, я сделал код немного более понятным, но кроме этого, я не смог найти ошибку, о которой ты говорил, что это?
 Adam26 мар. 2012 г., 18:45
SyntaxError: неожиданный токен для
 Adam19 мар. 2012 г., 02:03
Это более элегантно и более обобщенно, но не решает конкретную проблему, и в текущей версии есть ошибка.
 ajax33322119 мар. 2012 г., 01:59
Я думаю, что вы должны включить постоянную ссылку, потому что теоретически они могут изменить принятый ответ и опубликовать еще 100 ответов (и тогда было бы довольно сложно найти его)
 Óscar López19 мар. 2012 г., 02:03
@ ajax333221 согласился, я добавил постоянную ссылку, как вы предложили.

Ваш ответ на вопрос