如何在给定对象图中递归子数组并在不知道数组名称的情况下删除项?我的所有对象都有三个审计字段:
{
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,但没有成功......在我进行实验时刚刚删除了我的测试文件。我会再次重新创建它,所以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;
}
答案 0 :(得分: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;
});
});
文档: