BG Development


  Reply to this topicStart new topicStart Poll

> Обхождане на масив с незнаен брой dimensions
Zeardn
Публикувано на: 20-02-2019, 12:26
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 268
Регистриран на: 05.12.14



Колеги, чудя се как да обходя масив, на който не знам измеренията - двумерен, тримерен, четиримерен ... многомерен.

Как се нарича алгоритъма, на който трябва да обърна внимание и да разуча, за да се получи такова обхождане, под формата на дърво - нещо като дървовидно обхождане.

Езика, на който пиша е JavaScript. Като пример съм си създал следния масив:

CODE
let arr = [
      [
            ["arr[0][0]"],
            ["arr[0][1]"]
      ],
      [
            ["arr[1][0]"],
            ["arr[1][1]"]
      ],
      [
            [
                  ["arr[2][0][0]"],
                  ["arr[2][0][1]"]
            ],
            ["arr[2][1]"]
      ]
];


Представете си, че ви се дава масив, който не виждате. Трябва да изкарате всичките му крайни стойности от всички клетки. Крайна стойност е например текста "arr[2][0][0]" от примера.

Ако напиша прост цикъл за обхождане:

CODE

for(let i in arr) {
console.log(arr[i]);
}


... ще получа в резултата масиви - не е това целта.

Това мнение е било редактирано от Zeardn на 20-02-2019, 12:30


--------------------
StackOverflow Member
PMEmail Poster
Top
Lachezar
  Публикувано на: 20-02-2019, 12:49
Quote Post



Име: Лъчезар Добрев
Група: Потребител
Ранг: Почетен член

Мнения: 2707
Регистриран на: 10.11.04



Рекурсивно.
За всеки елемент от текущия масив проверяваш:
CODE
if (next && next.constructor === Array) {
  // This is an array, recursively check it.
  call_same_function(next);
} else {
  // This is not an array.
}


Примерно:
CODE
function recurse(array, visitor) {
  recursively(array, visitor, []);
}
function recursively(array, visitor, indexes) {
  for (let i = 0; i < array.length; i++) {
    indexes.push(i);
    if (array[i] && array[i].constructor === Array) {
      // Recursively call
      recursively(array[i], visitor, indexes);
    } else {
      // Call visitor
      visitor(array[i], indexes);
    }
    indexes.pop();
  }
}

Функцията се вика последователно за всеки елемент, като втори параметър получава индексите на елемента в многомерната структура.

Този алгоритъм е наивен, мисля, че се нарича Depth-First
Има други подходи: Breadth-First примерно.

П.П. Всичко това го пиша направо във форума и тествам с конзолата на ФФ. Моля да ме извините за неточности.


--------------------
И'м ватцхинг ъоу...
PMUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0