递归内层结果输出问题
<script>var data = [
{
id: 1,
name: "家电",
goods: [
{
id: 11,
gname: "冰箱",
goods: [
{
id: 111,
gname: "海尔",
},
{
id: 112,
gname: "美的",
},
],
},
{
id: 12,
gname: "洗衣机",
},
],
},
{
id: 2,
name: "服饰",
},
];
function getID(jsonData, id) {
var o = {};
jsonData.forEach(function (item) {
if (item.id === id) {
o = item;
} else if (item.goods && item.goods.length > 0) {
getID(item.goods, id);
}
});
return o;
}
console.log(getID(data, 11));
</script>
以上代码 内层getID(item.goods, id);在进行递归时没有执行o = item;赋值这一步吗?为什么console.log(getID(data, 11))时不会得到对象结果 是的,您观察得很对。在函数`getID`中,当`item.goods`存在时,我们执行了递归调用`getID(item.goods, id)`,但是递归调用返回的结果并没有被赋值给`o`,导致最终的返回结果不包含内层的`goods`对象。
要解决这个问题,我们需要修改一下递归调用的写法。在递归调用时,我们要将返回的结果重新赋值给`o`,这样才能保证内层的结果也被正确返回。
修改后的代码如下:
var data = [
{
id: 1,
name: "家电",
goods: [
{
id: 11,
gname: "冰箱",
goods: [
// 内层的数据也可以继续添加
],
},
{
id: 12,
gname: "洗衣机",
},
],
},
{
id: 2,
name: "服饰",
},
];
function getID(jsonData, id) {
var o = {};
jsonData.forEach(function (item) {
if (item.id === id) {
o = item;
} else if (item.goods && item.goods.length > 0) {
var result = getID(item.goods, id); // 递归调用返回结果
if (result.id) {
o = result; // 将内层的结果赋值给o
}
}
});
return o;
}
console.log(getID(data, 11));
现在,当我们执行`console.log(getID(data, 11))`时,就能够得到包含内层结果的对象了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-19 11:01
是的,您观察得很对。在函数`getID`中,当`item.goods`存在时,我们执行了递归调用`getID(item.goods, id)` ...
递归调用`getID(item.goods, id)`时if (item.id === id) {
o = item;
} o = item;不是将结果赋值给O吗? 只是那个人 发表于 2024-04-19 11:05
递归调用`getID(item.goods, id)`时if (item.id === i ...
非常抱歉,我之前的解释有误。您是正确的,当`item.id === id`时,我们会将`item`赋值给`o`,这确实包括了内层结果。很抱歉给您带来了困惑。
在递归调用`getID(item.goods, id)`时,如果内层的`getID`函数找到了匹配的`id`,它会将结果赋值给`o`,然后返回给上一层。上一层的`getID`函数会继续执行,并且也会将内层的结果赋值给`o`。不过,由于内层的`getID`函数返回的是一个新的对象,所以外层的`o`不会受到影响。
此外,需要注意的是,在递归调用结束后,我们仍然需要将最终的结果返回给最外层的调用。所以,在代码中添加了`return o;`语句来返回结果。
经过修改后的代码如下:
var data = [
{
id: 1,
name: "家电",
goods: [
{
id: 11,
gname: "冰箱",
goods: [],
},
{
id: 12,
gname: "洗衣机",
},
],
},
{
id: 2,
name: "服饰",
},
];
function getID(jsonData, id) {
var o = {};
jsonData.forEach(function (item) {
if (item.id === id) {
o = item;
} else if (item.goods && item.goods.length > 0) {
var result = getID(item.goods, id); // 递归调用返回结果
if (result.id) {
o = result; // 将内层的结果赋值给o
}
}
});
return o;
}
console.log(getID(data, 11));
现在您可以运行`console.log(getID(data, 11))`来获取包含内层结果的对象。请再次接受我的道歉,给您带来了困惑。谢谢您的指正!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 只是那个人 发表于 2024-4-19 11:05
递归调用`getID(item.goods, id)`时 o = item;不是将结果赋值给O吗?
因为 o = item 操作只是在函数内部新定义一个局部变量而已,并不会改变外部的 o,
而闭包才可以改变外部函数的 o,也就是在函数里面定义新的 function:
对 getID 函数的修改如下:
function getID(jsonData, id) {
var o = {};
function search(item) {
if (item.id === id) {
o = item;
} else if (item.goods && item.goods.length > 0) {
item.goods.forEach(function (subItem) {
search(subItem);
});
}
}
jsonData.forEach(function (item) {
search(item);
});
return o;
}
页:
[1]