Удалить объект из вложенного массива

У меня есть familytree, похожий на это:

{

    "children": [{
        "name": "bob",
        "children": [{
            "name": "sam",
            "children": [{
                "name": "mike",
                "children": [{
                    "name": "elias",
                    "children": []
                }, {
                    "name": "rodriguez",
                    "children": []
                }]
            }]
        }]
    }]
}

Основной "children" - массив, содержащий вложенные дочерние массивы. Как удалить объект из массива, как это? Допустим, я хочу удалить объект с именем "sam", который должен оставить меня со следующим:

{
    "children": [{
        "name": "bob",
        "children": []
    }]
}

Это гнездо, которое меня заводит, и я не понимаю, как начать.

Приветствуется любая помощь или указания учебника, посвященного подобным проблемам.

Ответы

Ответ 1

Recursion - хороший инструмент для работы с деревьями.

var tree = {

    "children": [{
        "name": "bob",
        "children": [{
            "name": "sam",
            "children": [{
                "name": "mike",
                "children": [{
                    "name": "elias",
                    "children": []
                }, {
                    "name": "rodriguez",
                    "children": []
                }]
            }]
        }]
    }]
}

function removeFromTree(parent, childNameToRemove){
  parent.children = parent.children
      .filter(function(child){ return child.name !== childNameToRemove})
      .map(function(child){ return removeFromTree(child, childNameToRemove)});
  return parent;
}
tree = removeFromTree(tree, 'elias')         
console.log(tree);
document.write(JSON.stringify(tree));

Ответ 2

Это предложение, которое выполняет итерацию по объектам и использует обратный поиск для удаления желаемого node с заданным именем.

Это решение сохраняет исходный объект и использует короткое замыкание, чтобы предотвратить больше, чем необходимо, итераций.

Он также использует recusion.

function deleteFromTree(o, name) {
    function getNode(a, i) {
        if (a.name === name) {
            index = i;
            return true;
        }
        if (Array.isArray(a.children) && a.children.some(getNode)) {
            if (~index) {
                a.children.splice(index, 1);
                index = -1;
            }
            return true;
        }
    }

    var index = -1;
    [o].some(getNode);
}

var tree = { "children": [{ "name": "bob", "children": [{ "name": "sam", "children": [{ "name": "mike", "children": [{ "name": "elias", "children": [] }, { "name": "rodriguez", "children": [] }] }] }] }] };

deleteFromTree(tree, 'sam');
document.write('<pre>' + JSON.stringify(tree, 0, 4) + '</pre>');

Ответ 3

Основные "дети" - это массив, содержащий вложенные дочерние массивы. Как Можно ли удалить объект из массива, как это? Допустим, я хочу удалите объект с именем "sam", который должен оставить меня с следующее:

{
    "children": [{
        "name": "bob",
        "children": []
    }]
}

Вы можете использовать JSON.stringify() replacer параметр для удаления свойств из возвращенной строки JSON

replacer Необязательный
Функция, которая изменяет поведение процесса строковой привязки или массив объектов String и Number, которые служат в качестве белого списка для выбора свойств объекта ценности для включения в строку JSON. Если это значение равно null или нет при условии, что все свойства объекта включены в результирующий JSON.

Параметр замены

Параметр replacer может быть либо функцией, либо массивом. Как функции, он принимает два параметра, причем ключ и значение строковый. Объект, в котором был найден ключ, представлен как замените этот параметр. Изначально он вызывается с пустой клавишей представляя объект, который является строгим, и затем его вызывают для каждое свойство объекта или массива стробируется. Должно верните значение, которое должно быть добавлено в строку JSON, следующим образом:

  • Если вы вернете Number, строка, соответствующая этому номеру, будет использоваться как значение свойства при добавлении в JSON строка.

  • Если вы вернете String, эта строка используется как значение свойства при добавлении ее в строку JSON.

  • Если вы вернете значение Boolean, в качестве значения свойства, в случае необходимости, используется значение true или false, при добавлении его в JSON string.

  • Если вы возвращаете какой-либо другой объект, объект рекурсивно строит в строку JSON, вызывая функцию замены на каждое свойство, если объект не является функцией, и в этом случае ничего не добавлено в строку JSON.

  • Если вы вернетесь undefined, свойство не будет включено в выходную строку JSON.

    Примечание. Вы не можете использовать функцию замены для удаления значений из массив. Если вы возвращаете undefined или функцию, тогда используется значение null вместо этого.


var prop = "name";
var value = "sam";
var res = JSON.stringify(data, function re(a, obj) {;
     return obj[prop] === value ? null : obj
  }, 2);

console.log(res, JSON.parse(res));

var data = {
  "children": [{
    "name": "bob",
    "children": [{
      "name": "sam",
      "children": [{
        "name": "mike",
        "children": [{
          "name": "elias",
          "children": []
        }, {
          "name": "rodriguez",
          "children": []
        }]
      }]
    }]
  }]
};

var prop = "name";
var value = "sam";
var res = JSON.stringify(data, function re(a, obj) {;
     return obj[prop] === value ? null : obj
  }, 2);

console.log(res, JSON.parse(res));

document.querySelector("pre").textContent = res;
<pre>
</pre>

Ответ 4

Вы можете использовать JSON.stringify(), JSON.parse(), String.prototype.match() с помощью RegExp /\{"name":"sam".*(?=\]\}\]\})/ для соответствия свойства с свойством "name" со значением "sam" удалить остаток строки до тех пор, пока ]}]} не станет частью строки с String.prototype.replace()

var res = JSON.parse(
  JSON.stringify(data)
  .replace(JSON.stringify(data).match(/\{"name":"sam".*(?=\]\}\]\})/)[0]
  , ""
  , ["children"])
);

var data = {

  "children": [{
    "name": "bob",
    "children": [{
      "name": "sam",
      "children": [{
        "name": "mike",
        "children": [{
          "name": "elias",
          "children": []
        }, {
          "name": "rodriguez",
          "children": []
        }]
      }]
    }]
  }]
}

var res = JSON.parse(
  JSON.stringify(data)
  .replace(JSON.stringify(data).match(/\{"name":"sam".*(?=\]\}\]\})/)[0]
  , ""
  , ["children"])
);

console.log(data)

document.querySelector("pre").textContent = JSON.stringify(res, null, 2);
<pre>
</pre>