循环直到在 Javascript 中找到一个空数组
Loop until find an array empty in Javascript
我正在尝试找到一个解决方案来进行循环 (Javascript),直到对象数组为空。这是我要使用的对象:
"chain": {
"evolves_to": [{
"evolves_to": [{
"evolves_to": [],
"species": {
"name": "nidoqueen"
}
}],
"species": {
"name": "nidorina"
}
}],
"species": {
"name": "nidoran-f"
}
}
我想循环直到发现变量 evolves_to
为空。并在每个循环中使用 species.name
来列出进化,在我的例子中:
nidoran-f -> nidorina -> nidoqueen
我还没有找到好的方法。有点失落。感谢您的帮助 ;)
你可以使用递归函数:
const chain = {
"evolves_to": [{
"evolves_to": [{
"evolves_to": [],
"species": {
"name": "nidoqueen"
}
}],
"species": {
"name": "nidorina"
}
}],
"species": {
"name": "nidoran-f"
}
}
, traverse = obj => {
if(!obj.evolves_to.length) {
console.log(obj.species.name)
return
} else {
console.log(obj.species.name, "=>")
traverse(obj.evolves_to[0])
}
}
traverse(chain)
或者在数组中收集值:
const chain = {
"evolves_to": [{
"evolves_to": [{
"evolves_to": [],
"species": {
"name": "nidoqueen"
}
}],
"species": {
"name": "nidorina"
}
}],
"species": {
"name": "nidoran-f"
}
}
, arr = []
, traverse = obj => {
if(!obj.evolves_to.length) {
arr.push(obj.species.name)
return
} else {
arr.push(obj.species.name)
traverse(obj.evolves_to[0])
}
}
traverse(chain)
console.log(arr.join(" -> "))
一个简单的递归函数应该可以解决问题:
const evolutions = {
"chain": {
"evolves_to": [{
"evolves_to": [{
"evolves_to": [],
"species": {
"name": "nidoqueen"
}
}],
"species": {
"name": "nidorina"
}
}],
"species": {
"name": "nidoran-f"
}
}
}
function findNoEvolution(obj, evolutionStages) {
if (obj.evolves_to.length > 0) {
for (let i = 0; i < obj.evolves_to.length; i += 1) {
const found = findNoEvolution(obj.evolves_to[i], evolutionStages);
if (found) {
evolutionStages.push(obj.species.name)
return found;
}
}
}
evolutionStages.push(obj.species.name)
return true;
}
const evolutionStages = [];
findNoEvolution(evolutions.chain, evolutionStages);
const evolutionStagesStr = evolutionStages.reverse().join(' -> ');
console.log(evolutionStagesStr);
然后将结果进化数组反转为通过reverse()
从第一次进化开始,并通过joing(' -> ')
用箭头连接。
我正在尝试找到一个解决方案来进行循环 (Javascript),直到对象数组为空。这是我要使用的对象:
"chain": {
"evolves_to": [{
"evolves_to": [{
"evolves_to": [],
"species": {
"name": "nidoqueen"
}
}],
"species": {
"name": "nidorina"
}
}],
"species": {
"name": "nidoran-f"
}
}
我想循环直到发现变量 evolves_to
为空。并在每个循环中使用 species.name
来列出进化,在我的例子中:
nidoran-f -> nidorina -> nidoqueen
我还没有找到好的方法。有点失落。感谢您的帮助 ;)
你可以使用递归函数:
const chain = {
"evolves_to": [{
"evolves_to": [{
"evolves_to": [],
"species": {
"name": "nidoqueen"
}
}],
"species": {
"name": "nidorina"
}
}],
"species": {
"name": "nidoran-f"
}
}
, traverse = obj => {
if(!obj.evolves_to.length) {
console.log(obj.species.name)
return
} else {
console.log(obj.species.name, "=>")
traverse(obj.evolves_to[0])
}
}
traverse(chain)
或者在数组中收集值:
const chain = {
"evolves_to": [{
"evolves_to": [{
"evolves_to": [],
"species": {
"name": "nidoqueen"
}
}],
"species": {
"name": "nidorina"
}
}],
"species": {
"name": "nidoran-f"
}
}
, arr = []
, traverse = obj => {
if(!obj.evolves_to.length) {
arr.push(obj.species.name)
return
} else {
arr.push(obj.species.name)
traverse(obj.evolves_to[0])
}
}
traverse(chain)
console.log(arr.join(" -> "))
一个简单的递归函数应该可以解决问题:
const evolutions = {
"chain": {
"evolves_to": [{
"evolves_to": [{
"evolves_to": [],
"species": {
"name": "nidoqueen"
}
}],
"species": {
"name": "nidorina"
}
}],
"species": {
"name": "nidoran-f"
}
}
}
function findNoEvolution(obj, evolutionStages) {
if (obj.evolves_to.length > 0) {
for (let i = 0; i < obj.evolves_to.length; i += 1) {
const found = findNoEvolution(obj.evolves_to[i], evolutionStages);
if (found) {
evolutionStages.push(obj.species.name)
return found;
}
}
}
evolutionStages.push(obj.species.name)
return true;
}
const evolutionStages = [];
findNoEvolution(evolutions.chain, evolutionStages);
const evolutionStagesStr = evolutionStages.reverse().join(' -> ');
console.log(evolutionStagesStr);
然后将结果进化数组反转为通过reverse()
从第一次进化开始,并通过joing(' -> ')
用箭头连接。