Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象推送到递归函数中包含数组的数组_Javascript_Meteor - Fatal编程技术网

Javascript 将对象推送到递归函数中包含数组的数组

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数据(对象)解析为Meteor web应用程序的数组,同时保留一些树信息,即:

{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=a
a
b
指向同一对象,因此对
a
所做的任何更改也将通过
b
可见,因为它们指向同一对象