2016-11-24 2 views
1


У меня есть рекурсивный массив. Таким образом, массив ниже может идти глубже и глубже.Цитирование через рекурсивный массив

0: "1" 
1: [ 
    0: "2" 
    1: [ 
     0: "3" 
    ] 
    2: [ 
     0: "4" 
     1: [ 
      0: "5" 
     ] 
    ] 
] 

Я хочу, чтобы выход был путём всех значений. Итак, 123 и 1245.

Как это можно сделать в методе Javascript?

+0

Я устанавливаю переменную и заполняю ее 'this.path + = i', где' i' является итератором цикла. Но я не мог понять, как можно рекурсивно цитировать. Я попробовал пример кода других людей, но это не помогло мне. –

+0

Без каких-либо доказательств того, что вы сами пытались решить эту проблему (нет неработающего кода) Я не собираюсь отвечать за вас, но я дам вам подсказку. Рекурсивные структуры данных могут обрабатываться с помощью рекурсивных алгоритмов. – GordonM

+0

хороший вопрос, но закрыт. –

ответ

1

Вам нужен рекурсивный метод для выравнивания рекурсивного массива.

Вот довольно простой один:

var data = ["1", 
[ 
    "2", 
    [ 
     "3" 
    ], 
    [ 
     "4", 
     [ 
      "5" 
     ] 
    ] 
]]; 

var flattened = []; 

function flatten(data, outputArray) { 
    data.forEach(function (element){ 
     if(Array.isArray(element)) { 
      flatten(element, outputArray); 
     } else { 
      outputArray.push(element); 
     } 
    }); 
} 

flatten(data, flattened); 

Это должно заставить вас двигаться в правильном направлении. Удачи!

+0

как вы получаете 123 и 1245? –

1

Вы можете попробовать lodash:

_.flattenDeep([1, [2, [3, [4]], 5]]); 
// => [1, 2, 3, 4, 5] 

https://lodash.com/docs/4.17.2#flattenDeep

, но я не уверен в вашем примере данных; вы сказали массив, но он выглядит (почти) как объект, и в этом случае вам придется сначала преобразовать это в массив. Опять же, lodash - твой друг!

Если вы не хотите использовать lodash вы могли бы попробовать что-то вроде этого:

var results = []; 
function flatten(arr) { 
    arr.forEach(function(item) { 
    if (Array.isArray(item)) { 
     flatten(item); 
    } 
    else { 
     results.push(item); 
    } 
    }) 
} 


flatten(data); 

Fiddle

Редактировать после комментария Нина Scholz

Похоже OP имеет объект с ключами «0», «1», «2» и т. Д., Каждый из которых может содержать рекурсивный массив. Таким образом, приведенный выше код должен быть выполнен по данным, связанным с каждым ключом, и результаты добавляются к значению ключа для получения 123, 1245 и т. Д.

+0

Для этого вполне может понадобиться сторонняя библиотека – GordonM

+0

Конечно, в этом случае это случай для рекурсивного трала массива. –

+0

Это не то, что ОП сказал, что он хочет сделать. –

0

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

var object = { 0: "1", 
1: { 
    0: "2", 
    1: { 
     0: "3" 
    }, 
    2: { 
     0: "4", 
     1: { 
      0: "5" 
     } 
    } 
}}; 

console.info(object); 

function traverse(obj) { 
    obj.keys.forEach(function(key) { 
    if (typeof(obj[key]) === 'object') { 
     traverse(obj[key]) 
    } 
     else { 
     //do something with the actual value 
     console.log(obj[key]) 
     } 
    })  
}; 

traverse(object) 

Можете ли вы указать, что вы имеете в виду с я хочу выход быть путем всех значений?

+0

Помните, что Javascript Arrays - это объекты с целыми ключами –

+0

Как вы получаете 123 и 1245? –

Смежные вопросы