2016-02-11 3 views
0

Как я могу регенерировать дочерние массивы в заданном графе объектов и удалять элементы, не зная имя массива? Все мои объекты имеют три аудит поля:Удалить детей из графа объектов (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; 
} 

ответ

1

Нечто подобное с lodash должно работать.

var companies = companies.map(function(company) { 
    // map each value of the company 
    return _.omitBy(_.mapValues(company, function(value) { 
    // if the value is an array, remove an object in the array if the `deletedDate` prop exists 
    if(Array.isArray(value)) { 
     return _.remove(value, function(o) { return 'deletedDate' in o }); 
    } else { 
     return value; 
    } 
    }), function(value) { 
    return Array.isArray(value) && value.length === 0; 
    }); 
}); 

Docs:

  1. mapValues
  2. remove (как фильтр)
  3. omitBy
+0

Есть ли способ, чтобы полностью удалить массив ребенка, если все элементы были удалены ? Вот где я застрял. –

+0

@ G.Deward, yup, отредактировал мой ответ с решением (используйте также omitBy) –

+0

Человек, ты потрясающий. Я не могу сказать, сколько времени я потратил на это. –

Смежные вопросы