2016-02-11 110 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值,則返回數組中的項目。

在上面的例子中,Employee「Mike」將從數組中移除。

我一直在嘗試使用Lodash,但一直沒有成功......並且剛剛在試驗時刪除了我的測試文件。我會再次重新創建它,所以這些人都知道我並不想懈怠。

原始方法
這是它我第一次(相當醜陋的)嘗試:

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; 
    }); 
}); 

文檔:

  1. mapValues
  2. remove(如過濾)
  3. omitBy
+0

有什麼辦法徹底刪除子陣列,如果所有項目被拆除?那是我陷入困境的地方。 –

+0

@ G.Deward,是的,編輯我的答案與解決方案(使用omitBy以及) –

+0

男人,你真棒。我無法告訴你我花了多長時間。 –