Javascript 将对象推送到递归函数中包含数组的数组
我试图将exif数据(对象)解析为Meteor web应用程序的数组,同时保留一些树信息,即:Javascript 将对象推送到递归函数中包含数组的数组,javascript,meteor,Javascript,Meteor,我试图将exif数据(对象)解析为Meteor web应用程序的数组,同时保留一些树信息,即: {exif:{size:{width:123}}} 将成为 [{key:width, value:123, path:["exif","size"]}] 这可以正常工作,除了objArray.path始终为空,而与p中的值无关。我一时兴起添加了depth:p.length,并且正确地添加了这个值 因此,如果p=[“通道统计”,“红色”],那么我希望objArray.path=[“通道统计”,“红色
{exif:{size:{width:123}}}
将成为
[{key:width, value:123, path:["exif","size"]}]
这可以正常工作,除了objArray.path
始终为空,而与p
中的值无关。我一时兴起添加了depth:p.length
,并且正确地添加了这个值
因此,如果p=[“通道统计”,“红色”]
,那么我希望objArray.path=[“通道统计”,“红色”]
和depth=2
,但是objArray.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()
action最后,p
在算法完成时推入objArray的所有对象中为空
解决方法是将p
的克隆插入推送到objArray中的对象中。
由于p
是一个纯字符串数组,我认为克隆(p)应该足够了(它是一个浅拷贝,所以嵌套数组或对象将通过引用进行拷贝)
例如:
objArray.push({ key: k, value: v, path: _.clone(p), depth: p.length });
如果
p
有嵌套的对象/数组,则必须进行深度复制,这有点复杂,可以在google/stackoverflow上找到。awesome!\。克隆()完成了这项工作。这种“现象”是否仅限于数组+递归?每当您将非“原始”类型(如数字、布尔、字符串)的对象指定给变量时,就会发生这种现象。对象是通过其在内存中的地址引用的,而不是通过其值引用的。假设您有var a={key:'value'};var b=aa
和b
指向同一对象,因此对a
所做的任何更改也将通过b
可见,因为它们指向同一对象