gpt4 book ai didi

javascript - 在递归函数中将对象推送到包含数组的数组

转载 作者:行者123 更新时间:2023-11-27 23:45:31 24 4
gpt4 key购买 nike

我正在尝试将 exif 数据(对象)解析为 Meteor Web 应用程序的数组,同时保留一些树信息,即:

{exif:{size:{width:123}}}

会变成

[{key:width, value:123, path:["exif","size"]}]

这工作正常,除了 objArray.path 始终为空,无论 p 中的值如何。一时兴起,我添加了 深度:p.length,并且该值被正确添加。

因此,如果p = ["Channel stats", "Red"],那么我期望objArray.path = ["Channel stats", "Red"]depth = 2objArray.path 始终返回 []

我做错了什么?

parseObject = function (obj) {
po = function (obj, p, objArray) {
_.each(obj, function (v, k) {
if (typeof v==='object') {
objArray.push({ key: k, value: null, path: p, depth: p.length});
p.push(k);
return po(obj[k], p, objArray);
}
objArray.push({ key: k, value: v, path: p, depth: p.length });
});
p.pop();
return objArray;
};
return po(obj, [], []);
};

最佳答案

每次将 p 添加到 objArray 中的对象时,您都会添加对数组的引用,而 p 也是对其的引用。因此,每次更改 p 时,基本上都会更改您放置的所有其他对象中的 p 。由于最后总是执行 p.pop(); 操作,因此算法完成时插入 objArray 的所有对象中的 p 都是空的。

解决这个问题的方法是将 p 的克隆插入到被插入 objArray 的对象中。由于 p 是一个纯字符串数组,我认为 _.clone(p) 应该足够了(它是浅拷贝,因此嵌套数组或对象将通过引用复制)。

示例:

objArray.push({ key: k, value: v, path: _.clone(p), depth: p.length });

如果p有嵌套的对象/数组,则必须进行深层复制,这有点复杂,可以在google/stackoverflow上找到。

关于javascript - 在递归函数中将对象推送到包含数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33235261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com