仅选取并显示大于 0 的值
Pick and display value which are greater than 0 only
我有如下数据结构,
var stat = {
meta : 0,
added : {
menuSessions: {
items: 0,
fields: 0
},
menuCats: {
items: 0,
fields: 0
},
menuItems: {
items: 0,
fields: 0
}
},
updated: {
menuSessions: {
items: 0,
fields: 0
},
menuCats: {
items: 0,
fields: 3
},
menuItems: {
items: 3,
fields: 0
}
},
deleted: {
menuSessions: 1,
menuCats: 10,
menuItems: 0
}
};
并想使用lodash
,
推导如下结构
var stat = {
//meta not shown
//added not shown
updated: {
menuCats: {
//items not show etc..
fields: 3
},
menuItems: {
items: 3,
}
},
deleted: {
menuSessions: 1,
menuCats: 10,
}
};
我尝试了很多方法,例如使用 filter
方法如下或纯 JS
(如果更容易),
var json = _.filter(stat, function(statEle){
return statEle > 0 || ((statEle.added && statEle.added.menuSessions) && (statEle.added.menuSessions.items > 0 || statEle.added.menuSessions.fields > 0))
|| ((statEle.updated && statEle.updated.menuSessions) && (statEle.updated.menuSessions.items > 0 || statEle.updated.menuSessions.fields > 0))
|| ((statEle.deleted && statEle.deleted.menuSessions) && (statEle.deleted.menuSessions > 0))
|| ((statEle.added && statEle.added.menuCats) && (statEle.added.menuCats.item > 0 || statEle.added.menuCats.fields > 0))
|| ((statEle.added && statEle.added.menuItems) && (statEle.added.menuItems.items > 0 || statEle.added.menuItems.fields > 0))
|| ((statEle.deleted && statEle.deleted.menuItems) && (statEle.deleted.menuItems > 0))
|| ((statEle.deleted && statEle.deleted.menuCats) && (statEle.deleted.menuCats > 0));
});
如 - Lodash: how do I use filter when I have nested Object? 所示,但由于此结构需要过滤动态 属性 名称而失败。
我对 JSON 过滤器和 lodsash 堆栈很陌生,如果有任何有用的参考/示例可以帮助我完成此任务,我将不胜感激 :) 谢谢
如果您组合 _.mapValues
and _.pickBy
- 您的答案是:pickByRecursive
。
var pickByRecursive = function (object, predicate) {
return _.pickBy(_.mapValues(object, function (value) {
return _.isObject(value) ? pickByRecursive(value, predicate) : value;
}), function (value) {
return _.isObject(value) ? !_.isEmpty(value) : predicate(value);
});
};
或 _.chain
:
var pickByRecursive = function (object, predicate) {
return _.chain(object)
.mapValues(function (value) {
return _.isObject(value) ? pickByRecursive(value, predicate) : value;
})
.pickBy(function (value) {
return _.isObject(value) ? !_.isEmpty(value) : predicate(value);
})
.value();
};
这样使用:
pickByRecursive(stat, function (value) {
return value > 0;
});
我有如下数据结构,
var stat = {
meta : 0,
added : {
menuSessions: {
items: 0,
fields: 0
},
menuCats: {
items: 0,
fields: 0
},
menuItems: {
items: 0,
fields: 0
}
},
updated: {
menuSessions: {
items: 0,
fields: 0
},
menuCats: {
items: 0,
fields: 3
},
menuItems: {
items: 3,
fields: 0
}
},
deleted: {
menuSessions: 1,
menuCats: 10,
menuItems: 0
}
};
并想使用lodash
,
var stat = {
//meta not shown
//added not shown
updated: {
menuCats: {
//items not show etc..
fields: 3
},
menuItems: {
items: 3,
}
},
deleted: {
menuSessions: 1,
menuCats: 10,
}
};
我尝试了很多方法,例如使用 filter
方法如下或纯 JS
(如果更容易),
var json = _.filter(stat, function(statEle){
return statEle > 0 || ((statEle.added && statEle.added.menuSessions) && (statEle.added.menuSessions.items > 0 || statEle.added.menuSessions.fields > 0))
|| ((statEle.updated && statEle.updated.menuSessions) && (statEle.updated.menuSessions.items > 0 || statEle.updated.menuSessions.fields > 0))
|| ((statEle.deleted && statEle.deleted.menuSessions) && (statEle.deleted.menuSessions > 0))
|| ((statEle.added && statEle.added.menuCats) && (statEle.added.menuCats.item > 0 || statEle.added.menuCats.fields > 0))
|| ((statEle.added && statEle.added.menuItems) && (statEle.added.menuItems.items > 0 || statEle.added.menuItems.fields > 0))
|| ((statEle.deleted && statEle.deleted.menuItems) && (statEle.deleted.menuItems > 0))
|| ((statEle.deleted && statEle.deleted.menuCats) && (statEle.deleted.menuCats > 0));
});
如 - Lodash: how do I use filter when I have nested Object? 所示,但由于此结构需要过滤动态 属性 名称而失败。
我对 JSON 过滤器和 lodsash 堆栈很陌生,如果有任何有用的参考/示例可以帮助我完成此任务,我将不胜感激 :) 谢谢
如果您组合 _.mapValues
and _.pickBy
- 您的答案是:pickByRecursive
。
var pickByRecursive = function (object, predicate) {
return _.pickBy(_.mapValues(object, function (value) {
return _.isObject(value) ? pickByRecursive(value, predicate) : value;
}), function (value) {
return _.isObject(value) ? !_.isEmpty(value) : predicate(value);
});
};
或 _.chain
:
var pickByRecursive = function (object, predicate) {
return _.chain(object)
.mapValues(function (value) {
return _.isObject(value) ? pickByRecursive(value, predicate) : value;
})
.pickBy(function (value) {
return _.isObject(value) ? !_.isEmpty(value) : predicate(value);
})
.value();
};
这样使用:
pickByRecursive(stat, function (value) {
return value > 0;
});