2017-06-28 48 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例子看他回答 –