我有一个递归数组。所以下面的数组可以越来越深。
0: "1"
1: [
0: "2"
1: [
0: "3"
]
2: [
0: "4"
1: [
0: "5"
]
]
]
我希望输出成为所有值的路径。所以123和1245。
如何在Javascript方法中完成?
答案 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);
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)
你能说明你对的意思吗?我希望输出成为所有值的路径?