2017-06-28 85 views
2
var template = { 
    personal: {}, 
    education: {}, 
    certificate: [{"test": "Test"}, {}, {}], 
    experience: [] 
} 

removeEmptyObj(template); 

function removeEmptyObj(obj) 
for (var key in obj) { 
    console.log("Foor Loop" + key + " " + obj[key]); 
    if (_.isObject(obj[key]) && !_.isEmpty(obj[key])) { 
     console.log("Second Loop Object:::" + key + " " + obj[key]); 
     removeEmptyObj(obj[key]); 
    } 
    if (_.isEmpty(obj[key])) { 
     console.log("Delete Object:::" + key + " " + obj[key]); 
     obj = _.omitBy(obj, _.isEmpty); 
    } 
} 
console.log(obj); 
return obj; 
} 

電流輸出爲刪除空對象:{certificate: [{"test": "Test"}, {}, {}]}如何從JSON遞歸使用lodash

所需的輸出:{certificate: [{"test": "Test"}]}

什麼是錯在這裏你的幫助感激:)

回答

2

您可以遞歸_.transform()對象到一個新的,乾淨的空對象和數組的方式。

注:我添加更多的元素在結構示範

var template = { 
 
    personal: {}, 
 
    education: {}, 
 
    certificate: [{}, {"test": "Test"}, {}, {}, [{}], [{}, 1, []]], 
 
    experience: [[1, 2, [], { 3: [] }]] 
 
}; 
 

 
function clean(el) { 
 
    function internalClean(el) { 
 
    return _.transform(el, function(result, value, key) { 
 
     var isCollection = _.isObject(value); 
 
     var cleaned = isCollection ? internalClean(value) : value; 
 

 
     if (isCollection && _.isEmpty(cleaned)) { 
 
     return; 
 
     } 
 

 
     _.isArray(result) ? result.push(cleaned) : (result[key] = cleaned); 
 
    }); 
 
    } 
 

 
    return _.isObject(el) ? internalClean(el) : el; 
 
} 
 

 
console.log(clean(template));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

這會在數組中留下空隙。例如'[{},{test:1}]'變成'[undefined,{test:1}]''。 – trincot

+0

@trincot - 感謝您的收穫。我重構了它,現在它會遞歸地清理一切。 –

+1

它的工作就像魅力:) @OriDrori –

0

你試過_。省略(證書,[{}])。我從來沒有嘗試,但讓我知道

+0

這是如何以遞歸方式進行的? drioemgaoin –

+0

你的意思是很深的?因爲這種方法將刪除所有發生在同一級別 – drioemgaoin

+0

yaah深的方式,如果你看看我的O/P問題只是'證書'而不是個人,教育,體驗它已經根據我的要求刪除。 –

1

沒有需要Lodash的。一個簡單的過濾器會做。

var template = { 
 
    personal: {}, 
 
    education: {}, 
 
    certificate: [{"test": "Test"}, {}, {}], 
 
    experience: [] 
 
} 
 

 
template.certificate = template.certificate.filter(o => Object.keys(o).length) 
 

 
console.log(template.certificate)

+0

我需要遞歸 –

+0

我不知道證書總是這樣的空也許也是另一個對象是這樣的空個人,教育,證書,經驗等..需要遞歸 –

+0

啊,我遵循你當前的輸出/期望輸出。 –

1

您可以使用此功能,使得普通的對象和數組之間的區別:

// Helper function 
 
var isEmptyObject = _.overEvery(_.isObject, _.isEmpty); 
 
// Actual function 
 
function removeEmptyObj(obj) { 
 
    return _.isArray(obj) ? _.reject(_.map(obj, removeEmptyObj), isEmptyObject) 
 
      : _.isObject(obj) ? _.omitBy(_.mapValues(obj, removeEmptyObj), isEmptyObject) 
 
      : obj; 
 
} 
 

 
// Example 
 
var template = { 
 
    personal: {}, 
 
    education: {}, 
 
    certificate: [{"test": "Test"}, {}, {}], 
 
    experience: [] 
 
} 
 

 
var result = removeEmptyObj(template); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

+0

我覺得有點遺漏:你評論除我以外的所有答案;-) – trincot

0

你可以試試這個方法,它適用於你的例子。我很確定我們可以以更好的方式做到這一點,但至少可以解除阻塞

deepOmit(obj) { 
    function omitFromObject(obj) { 
     return _.transform(obj, function(result, value, key) { 
      if (_.isNull(value) || _.isUndefined(value) || _.isEmpty(value)) { 
       return; 
      } 

      result[key] = _.isObject(value) ? omitFromObject(value) : value; 
     }); 
    } 

    return omitFromObject(obj); 
} 
+0

我只是檢查它。這是行不通的,但謝謝你的答案@drioemgaoin –

+0

你有沒有嘗試過你提供的相同的例子或更復雜的東西?您可能會給我們更多的測試環境,因爲很少有人提供一個以您的示例爲我們工作的示例。 – drioemgaoin

+0

我用@OriDrori例子看他回答 –