Удалить объект из вложенного массива
У меня есть 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>