Как я могу регенерировать дочерние массивы в заданном графе объектов и удалять элементы, не зная имя массива? Все мои объекты имеют три аудит поля:Удалить детей из графа объектов (JavaScript)
{
id, // String
userId, // String
createdDate, // Date
updatedDate, // Date - OPTIONAL
deletedDate // Date - OPTIONAL
}
Если deletedDate
свойства существует, то элемент должен быть удален из массива.
Пример:
var companies = [
{
id : 'abc123',
name : 'ABC, Inc.',
employees: [
{
id : 'abc-01',
name : 'Joe',
createdDate: '1/1/2015',
userId : 'asdf87612'
},
{
id : 'abc-02',
name : 'Mike',
createdDate: '1/1/2015',
deletedDate: '1/2/2015'
userId : 'asdf87612'
}
]
createdDate: '1/1/2015',
userId : 'asdf87612'
}
];
Функция должна быть достаточно, чтобы 1 родовым) найти все свойства, которые являются массивами, и 2) рекурсией массива, чтобы найти элементы, которые имеют множество deletedDate
свойств, и 3) удалить элемент из массива, если значение deletedDate
установлено.
В приведенном выше примере сотрудник «Майк» будет удален из массива.
Я пытался использовать Lodash для этого, но не был успешным ... и просто удалил свой тестовый файл, пока я экспериментировал. Я воссоздаю его снова, так что люди на SO знают, что я не пытаюсь уйти.
Оригинальный метод
Это был мой первый (довольно уродливый) попытка на него:
function removeDeleted (itemOrArray) {
if (itemOrArray == null || typeof itemOrArray == 'undefined') { return itemOrArray; }
var result = [],
items = (itemOrArray instanceof Array) ? itemOrArray : [itemOrArray];
for (var i = 0; i < items.length; i += 1) {
if (items[i].dateDeleted) { continue; }
for (var k = 0; k < Object.keys(items[i]).length; k += 1) {
var key = Object.keys(items[i])[k];
if (items[i][key] instanceof Array) {
items[i][key] = removeDeleted(items[i].key);
}
}
result.push(items[i]);
}
return result;
}
Есть ли способ, чтобы полностью удалить массив ребенка, если все элементы были удалены ? Вот где я застрял. –
@ G.Deward, yup, отредактировал мой ответ с решением (используйте также omitBy) –
Человек, ты потрясающий. Я не могу сказать, сколько времени я потратил на это. –