Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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 更改所有子对象的位置后删除JSON父对象_Javascript_Json - Fatal编程技术网

Javascript 更改所有子对象的位置后删除JSON父对象

Javascript 更改所有子对象的位置后删除JSON父对象,javascript,json,Javascript,Json,我正在尝试创建一个通用JSON函数,该函数将被发送一个源、目标以及完成后是否应该删除空的父函数。问题是,我不确定在父对象为空并通过循环完成后如何删除它 我的代码正在成功地获取子项并移动它们,以及从当前父项中删除子项。我面临的问题是试图在完成后删除父对象本身 let j = { 'test': 'test', 'remove': { 'string1' : 'hello', 'string2' : 'world' } } moveAll(j.remove,j,true); fu

我正在尝试创建一个通用JSON函数,该函数将被发送一个源、目标以及完成后是否应该删除空的父函数。问题是,我不确定在父对象为空并通过循环完成后如何删除它

我的代码正在成功地获取子项并移动它们,以及从当前父项中删除子项。我面临的问题是试图在完成后删除父对象本身

let j = {
    'test': 'test',
    'remove': { 'string1' : 'hello', 'string2' : 'world' }
}

moveAll(j.remove,j,true);

function moveAll(src, dst, del) {
    del = del || false;
    for ( let item in src ) {
        dst[item] = src[item];
        if(del) {
            delete src[item];
        }
    }
}
通过上面的代码,我试图获取remove的内容,并将它们放置在mainobjects位置

因此,如果它按预期的那样工作,它将是这样的

let j = {
    'test': 'test',
    'string1' : 'hello',
    'string2' : 'world' 
}
这就是我目前得到的。我尝试使用
删除src
,但是src只包含remove的内容,而不包含remove本身。所以我想知道是否有一种方法可以访问家长

let j = {
  'test': 'test',
  'remove': { },
  'string1' : 'hello',
  'string2' : 'world'
}
这只是我想做的一个基本想法,所以我知道还有很多事情需要做。但我试图查找这个问题,却找不到解决方案


提前谢谢

无法从
moveAll
函数(如所写)中删除父对象,因为它没有对
j
对象的任何引用。(您传入
j.remove
,但它本身没有
j
。)

这将有助于:

moveAll(j, 'remove', j, true);

function moveAll(obj, key, dst, del) {
    src = obj[key]
    del = del || false;
    for ( let item in src ) {
        dst[item] = src[item];
        if(del) {
            delete src[item];
        }
    }

    if (del) 
        delete obj[key]
}

现在,您的函数可以访问父对象,并且可以轻松地在最后执行一个
delete obj[key]

一个替代方法是循环检查
dst
的所有键,并检查它们是否指向
src
。如果是,请从
dst
中删除该键(注意,这假定
src
dst
的直接子项)

函数moveAll(src、dst、del){
del=del | | false;
用于(让项目进入src){
dst【项目】=src【项目】;
}
if(del){
for(让k在dst中){
如果(dst[k]==src)删除dst[k];
}
}
}
设j={
“测试”:“测试”,
“删除”:{
'字符串1':'你好',
“string2”:“世界”
}
}
moveAll(j.remove,j,true);

控制台日志(j)一旦您将它们传递到函数中,src和dst是两个不同的对象,因此在src上使用delete不会给您带来任何好处。您需要像下面那样删除dst.remove,但需要找到在函数中引用它的方法

let j = {
'test': 'test',
'remove': { 'string1' : 'hello', 'string2' : 'world' }
}

moveAll(j.remove,j,true);

function moveAll(src, dst, del) {
del = del || false;
for ( let item in src ) {
    dst[item] = src[item];
    if(del) {
        //delete src[item];
    }
}
delete dst.remove;
}

不,没有对父对象的引用。您需要调用
delete j['remove']
。但一旦你这么做了,就没有必要单独删除每一项了。谢谢,我有一种感觉,那是不可能的,但我想我还是会要求有机会的。