Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于检测不存在对象中的JSON属性的函数_Javascript_Jquery_Json_Object - Fatal编程技术网

Javascript 用于检测不存在对象中的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

有没有一种方法可以在不提供特定对象的情况下检查JSON中是否存在属性

比如说,

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;iISProphere(数据,'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
函数。很明显,..for
isprophere(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");