如何启用JavaScript循环递归迭代未知次数?
我已经在JavaScript中遇到过一些我不熟悉的问题。我猜测可能有一种简单的方法来解决这类问题,但我不清楚它可能是什么。如何启用JavaScript循环递归迭代未知次数?
- 我有一个包含一系列对象的数组。
- 这些对象中的每一个都可能(或可能不)包含一个包含一系列对象的较深的数组。
- 每个那些对象可以(或可以不)包含其中含有
- 一系列对象的更深的阵列(等等...)
我需要处理在每个每个对象一系列的对象,所以写一个function
其中运行一个for loop
,我可以反复调用似乎是明显的方法。
但是...(这里的问题)......因为函数可以调用本身的次重复的次数,我怎么能写一个循环不断深入到对象,深,因为它需要?
下面是一个例子...
有了这个对象:
for (var i = 0; i < Object.keys(myObject.level1).length; i++) {
for (var j = 0; j < (Object.values(myObject.level1[i]).length); j++) {
if (typeof Object.values(myObject.level1[i])[j] === 'string') {
console.log(Object.values(myObject.level1[i])[j]);
}
else {
for (var k = 0; k < Object.values(myObject.level1[i])[j].length; k++) {
for (var l = 0; l < (Object.values(Object.values(myObject.level1[i])[j][k]).length); l++) {
if (typeof Object.values(Object.values(myObject.level1[i])[j][k])[l] === 'string') {
console.log(Object.values(Object.values(myObject.level1[i])[j][k])[l]);
}
}
}
}
}
}
证明:
{
"level1": [
{
"FirstItem": "one",
"SecondItem": "two",
"ThirdItem": [
{
"FirstItem": "three",
"SecondItem": "four"
}
]
},
{
"FirstItem": "five",
"SecondItem": "six",
"ThirdItem": [
{
"FirstItem": "seven",
"SecondItem": "eight"
}
]
}
]
}
我能以正确的顺序使用该嵌套循环日志值
var myObject = {};
myObject['level1'] = [];
myObject.level1[0] = {FirstItem: 'one', SecondItem: 'two'};
myObject.level1[0]['ThirdItem'] = [];
myObject.level1[1] = {FirstItem: 'five', SecondItem: 'six'};
myObject.level1[1]['ThirdItem'] = [];
myObject.level1[0].ThirdItem[0] = {FirstItem: 'three', SecondItem: 'four'};
myObject.level1[1].ThirdItem[0] = {FirstItem: 'seven', SecondItem: 'eight'};
for (var i = 0; i < Object.keys(myObject.level1).length; i++) {
for (var j = 0; j < (Object.values(myObject.level1[i]).length); j++) {
if (typeof Object.values(myObject.level1[i])[j] === 'string') {
console.log(Object.values(myObject.level1[i])[j]);
}
else {
for (var k = 0; k < Object.values(myObject.level1[i])[j].length; k++) {
for (var l = 0; l < (Object.values(Object.values(myObject.level1[i])[j][k]).length); l++) {
if (typeof Object.values(Object.values(myObject.level1[i])[j][k])[l] === 'string') {
console.log(Object.values(Object.values(myObject.level1[i])[j][k])[l]);
}
}
}
}
}
}
但是...循环绝对是可怕的。它是冗长而丑陋的。而且,如果它需要深入到对象中,它究竟会如何提出迭代器m
,n
,o
和p
?
我猜测另一种类型的循环(如while
或do... while
)可能是一种更好的方法,但我不清楚javascript如何确定对象的深度。
最终,我猜测这只是一个我不熟悉的模式的例子,而且我使用错误的工具笨拙地产生了正确的结果。
function printValues(inputObj) {
for (var key in inputObj) {
if (Array.isArray(inputObj[key])) {
inputObj[key].forEach(function(currentObj) {
printValues(currentObj);
});
} else {
console.log(inputObj[key]);
}
}
}
非常棒,@Andrea - 非常令人印象深刻。 '阵列。isArray()'对我来说是新的;我知道'for for循环中枚举'objects',尽管我仍然试图解决它,并且我熟悉'forEach'。你写了一个非常简洁和优雅的功能 - 正是我试图建立的那种东西。谢谢。 – Rounin
这本质上是一个树(数据结构)。树由父节点和子节点组成。每个节点都有一个值,有些节点有一个子属性,它是其他节点的数组。我希望这个链接有帮助,https://en.wikipedia.org/wiki/Tree_traversal。
简单的答案是“使用递归函数” - 即。 https://www.sitepoint.com/recursion-functional-javascript/每次递归调用都会收到一个不同的对象/集合(前一个/父级调用的“根”对象的子元素之一)。 – user2864740