循环遍历递归数组

时间:2016-11-24 13:15:48

标签: javascript arrays recursion


我有一个递归数组。所以下面的数组可以越来越深。

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

我希望输出成为所有值的路径。所以123和1245。

如何在Javascript方法中完成?

3 个答案:

答案 0 :(得分:2)

您需要一个递归方法来展平递归数组。

这是一个非常基本的:

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

这应该让你朝着正确的方向前进。祝你好运!

答案 1 :(得分: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

Nina Scholz评论后编辑

看起来OP有一个带有键'0','1','2'等的对象,每个对象可能包含一个递归数组。因此,上面的代码必须在与每个键相关联的数据上执行,并将结果附加到键的值以获得123,1245等。

答案 2 :(得分: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)

你能说明你对的意思吗?我希望输出成为所有值的路径