[英]How to convert JavaScript array (or delimited string) to an object with sub-objects
[英]How do I check to see if an object or its children/sub-objects has a property/key in Javascript?
我正在寻找的基本上是一个hasOwnProperty()或'in'函数,它是递归的,并向下看链以查看对象中是否存在键或属性。
例如,我有对象:
var user = {
username: "Derpette",
profile: {
role: 'admin',
sex: 'female',
emails:['derpette42@derpmail.com']
}
}
我想知道对象或其子对象中的任何位置是否存在键/属性“角色”。 所以我希望能够调用user.hasProperty('role')
这样的东西,它会返回true
。
现在我正在使用带有断言链的if语句进行检查,但它看起来并不干净,特别是对于深层嵌套属性。
例如,我会这样做:
if(user && user.profile && user.profile.role){
//Manipulate/Use user.profile.role here
}
另一个用例的例子是我是否正在过滤来自客户端的mongoDB更新修饰符。 我想确保他们没有更新自己的角色所以我需要检查属性'role'不在他们的mongoDB修饰符json对象中的某个位置。 但它可能位于修饰符中的一些位置,因此执行if属性链接对于此情况不起作用。
我是否需要编写自己的递归hasOwnProperty? 我认为像这样的东西应该已经存在于像jquery或underscores.js或sugar.js这样的项目中,但我似乎无法找到它。
你可以递归地做到这一点:
function recHasProp(obj, prop) {
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
if (p === prop) {
return obj;
} else if (obj[p] instanceof Object && recHasProp(obj[p], prop)) {
return obj[p];
}
}
}
return null;
}
用法:
var obj = recHasProp(user, 'role');
if (obj) {
// obj.role exists, and obj is user or a child of user
}
我对此有所了解,它并不漂亮,但它在几行中非常高效。
function hasProp(obj, propPath, i) {
if (typeof(i) === 'undefined' && !(i=0)) {
propPath = propPath.split('.');
}
if (typeof(obj[propPath[i]]) !== 'undefined') {
return (++i && i !== propPath.length) ? hasProp(obj[propPath[i - 1]], propPath, i) : true;
}
return false;
};
用法示例(在您的情况下):
hasProp(user, 'profile.role');
Plunker: http ://plnkr.co/edit/CIePivi3XcTEugFzEUyt?p =preview
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.