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

时间:2018-11-14 18:34:16

标签: javascript json

我正在尝试创建一个通用的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的内容并将其放置在主要对象的位置。

因此,如果它按预期工作,将会是这样。

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

这就是我目前得到的。我尝试使用delete src,但src仅包含remove的内容,而不包含本身。所以我想知道是否有一种方法可以访问父级。

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

这只是我想做的基本想法,所以我知道仍然有很多事情要做。但是我尝试查找此问题,但找不到解决方案。

谢谢!

3 个答案:

答案 0 :(得分:1)

您无法从hashCode()函数中删除父对象(按书面规定),因为它没有对hashCode()对象的引用。 (您传入了hashCode(),但它本身没有moveAll。)

这将起作用:

j

现在,您的函数可以访问父对象,并且可以轻松地在末尾执行j.remove

答案 1 :(得分:1)

一种选择是遍历dst的所有键,并检查它们是否指向src。如果是,请从dst中删除该密钥(请注意,这假定srcdst的直接子代)。

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

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

moveAll(j.remove, j, true);
console.log(j);

答案 2 :(得分:1)

一旦将它们传递到函数src和dst中,它们是2个不同的对象,因此在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;
}