Javascript 用于检测不存在对象中的JSON属性的函数
有没有一种方法可以在不提供特定对象的情况下检查JSON中是否存在属性 比如说,Javascript 用于检测不存在对象中的JSON属性的函数,javascript,jquery,json,object,Javascript,Jquery,Json,Object,有没有一种方法可以在不提供特定对象的情况下检查JSON中是否存在属性 比如说, data.programs.text.background background是text的属性。但是如果当前对象中不存在text对象怎么办 JSON: 控制台将给出一个错误uncaughttypeerror:无法读取未定义的属性“background” 测试data.programs.text.background==undefined不起作用 是否可以编写一个函数,通过简单地提供对对象属性(如data.prog
data.programs.text.background
background
是text
的属性。但是如果当前对象中不存在text
对象怎么办
JSON:
控制台将给出一个错误uncaughttypeerror:无法读取未定义的属性“background”
测试data.programs.text.background==undefined
不起作用
是否可以编写一个函数,通过简单地提供对对象属性(如
data.programs.text.background
)的引用来检测对象是否存在以及属性是否存在?您可以使用它来确定对象是否具有对象上的属性。遍历路径并使用Object.prototype.hasOwnProperty
function exists(object, path) {
if (path.length === 0) {
return true;
}
return Object.prototype.hasOwnProperty.call(object, path[0])
&& exists(object[path[0]], path.slice(1));
}
console.log(exists({}, [ "foo", "bar" ])); // false
console.log(exists({ "foo": { "bar": {} } }, [ "foo", "bar" ])); // true
console.log(exists({ "hasOwnProperty": { "bar": {} } }, [ "hasOwnProperty", "bar" ])); // true
// usage:
exists(data, [ "programs", "text", "background" ]);
我有另一个想法 你可以做:
function exists(string, context) {
var parts = string.split("."), part;
context = context || window;
while (parts.length > 0) {
part = parts.shift();
if (Object.prototype.hasOwnProperty.call(context, part) === false) {
return false;
}
context = context[part];
}
return true;
}
exists("data.programs.text.background");
使用以下代码查找是否存在属性
var数据={
“方案”:[
{
“宽度”:500,
“高度”:600,
“文本”:{
“前景”:“黑色”,
“背景”:“白色”
}
},
{
“宽度”:100,
“高度”:200
},
{
“宽度”:800,
“高度”:300,
“文本”:{
“前景”:“黄色”,
“背景”:“红色”
}
}
]
}
函数isPropThere(根,prop){
var keys=prop.split(/[,\[\]]+/);
对于(变量i=1;i ISProphere(数据,'data.programs[2].text.background');//present-red
您可能需要遍历到链的末尾,并逐个比较嵌套属性。不确定这是否回答了问题,因为OP说“没有提供特定对象?”这看起来不错。无论如何,要使函数只接受一个参数,最好不要使用字符串,例如isprophere(data.programs.methods)
?您可以使用root=eval(键[0])
,但不建议使用eval
。请提供示例?使root=eval(键[0])不起作用。函数isPropThere(prop){
var-keys=prop.split('.');var-root=eval(键[0]);其他代码保持不变并使用isPropThere(data.programs.methods)调用
。但请记住,正如我所说,不建议使用eval
函数。很明显,..forisprophere(data.programs.methods);
您需要将参数作为字符串“data.programs.methods”
传递,因为对象本身不存在,对于isprophere('data.programs.width'));不存在是正确的结果,因为宽度不存在于程序上,而存在于它的列表中。是否有任何方法可以在此格式的函数中传递参数?存在(data.programs.methods)
您不能这样对它进行pas,因为在传递之前会对它进行评估。您可以传递未定义的值,也可以传递错误。但是,您可以将其作为字符串传递:存在(“data.programs.methods”)
查看我的更新答案。
function exists(string, context) {
var parts = string.split("."), part;
context = context || window;
while (parts.length > 0) {
part = parts.shift();
if (Object.prototype.hasOwnProperty.call(context, part) === false) {
return false;
}
context = context[part];
}
return true;
}
exists("data.programs.text.background");