我正在练习递归并编写了这个函数:
var bigArray = ['a', ['b', ['c', ['d', {a:'e'}]]]];
var results = [];
function bagger293(bigArray){
for (var item in bigArray){
if (Array.isArray(bigArray[item])){
bagger293(bigArray[item]);
}
else if (typeof bigArray[item] === 'object'){
bagger293(bigArray[item]);
}else{
results.push(bigArray[item]);
}
}
}
bagger293(bigArray);
console.log(results);
我只是希望函数将任何单个值推送到数组,并且如果它是对象或数组则更深入地搜索。奇怪的是,我的函数返回了这个:
[ 'a',
'b',
'c',
'd',
'e',
'd',
'e',
'c',
'd',
'e',
'd',
'e',
'b',
'c',
'd',
'e',
'd',
'e',
'c',
'd',
'e',
'd',
'e' ]
我认为这是因为我的指定方式
bigArray[item]
但不知道原因究竟是什么。
预期结果:
['a', 'b', 'c', 'd', 'e']
答案 0 :(得分:4)
你错过了else
。一旦你发现了一个阵列,就不要再尝试用其他东西了。
var bigArray = ['a', ['b', ['c', ['d', { a: 'e' }]]]];
var results = [];
function bagger293(bigArray) {
for (var item in bigArray) {
if (Array.isArray(bigArray[item])) {
bagger293(bigArray[item]);
}
else if (typeof bigArray[item] === 'object') { // <--
bagger293(bigArray[item]);
}
else {
results.push(bigArray[item]);
}
}
}
bagger293(bigArray);
console.log(results);
另一方面,由于所有数组都是对象,因此您只需测试'object'
:
var bigArray = ['a', ['b', ['c', ['d', { a: 'e' }]]]];
var results = [];
function bagger293(bigArray) {
for (var item in bigArray) {
if (typeof bigArray[item] === 'object') {
bagger293(bigArray[item]);
}
else {
results.push(bigArray[item]);
}
}
}
bagger293(bigArray);
console.log(results);
答案 1 :(得分:3)
你错过了其他人。由于数组也是一个对象,因此您的代码会开始两次递归。
这是有效的:
function bagger293(bigArray){
for (var item in bigArray){
if (Array.isArray(bigArray[item])){
bagger293(bigArray[item]);
}else if (typeof bigArray[item] === 'object'){
bagger293(bigArray[item]);
}else{
results.push(bigArray[item]);
}
}
}
答案 2 :(得分:2)
所有数组都是对象。无需同时检查Array.isArray
和typeof == 'object'
。
var bigArray = ['a', ['b', ['c', ['d', {a:'e'}]]]];
var results = [];
(function bagger293(bigArray) {
for (var item in bigArray)
if (typeof bigArray[item] === 'object')
bagger293(bigArray[item]);
else
results.push(bigArray[item]);
})(bigArray);
console.log(results);