在Javascript中,给定值,从Object literal中查找值并过滤特定值

在Javascript中,给定值,从Object literal中查找值并过滤特定值,javascript,jquery,object,object-literal,Javascript,Jquery,Object,Object Literal,我应该指出,我并不是Javascript/ajax/jquery的高手。无论如何,我需要一些帮助来检查一个对象,看看它是否包含一个基于对象文字的特定值。我正在为一个正在进行的项目使用。我使用的库可视化不是使用真正的json对象,而是更多的javascript对象文本。我很难确定我的对象中是否存在项 为了适应我的代码,我在做了更改之后尝试了,但是,它似乎不能正常工作 我还尝试了一个for..in循环,我知道它是不受欢迎的(而且我也没有像预期的那样工作) 以下是对象及其结构: myObj = {

我应该指出,我并不是Javascript/ajax/jquery的高手。无论如何,我需要一些帮助来检查一个对象,看看它是否包含一个基于对象文字的特定值。我正在为一个正在进行的项目使用。我使用的库可视化不是使用真正的json对象,而是更多的javascript对象文本。我很难确定我的对象中是否存在项

为了适应我的代码,我在做了更改之后尝试了,但是,它似乎不能正常工作

我还尝试了一个for..in循环,我知道它是不受欢迎的(而且我也没有像预期的那样工作)

以下是对象及其结构:

 myObj = {
    id: "190_0",
    name: "Pearl Jam",
    children: [{
        id: "306208_1",
        name: "Pearl Jam & Cypress Hill",
        children: [{
            id: "84_2",
            name: "Cypress Hill",
            children: []
        },
        {
            id: "306208_3",
            name: "Alex"
        }]
    }]
};
[编辑] 在这个例子中,我试图找到“Alex”,但我所尝试的一切都失败了。我需要它来查看整个结构,所以我不能有硬编码的选择(myObj.children[0].name…)

我的项目的最终目标是能够搜索具有特定技能集的用户。例如:

<>我想搜索SkiSeC+C++,然后显示C++的所有子(这将是人的名字)。 [/编辑]


提前感谢您的帮助。

在澄清之后,这里有一个递归的方法来检查:

这里是一个小的实现

function contains(obj,what){
    if(obj === what){ 
        return true;
    }
    if(typeof obj!== "object" || obj === null){
        return false;
    }
    for(var i in obj){
        if(contains(obj[i],what)){
            return true;
        }
    }
   return false;
}
这适用于所有新旧浏览器,并且没有依赖关系。再次注明:

function contains(obj,what){
    if(obj === what){ // if the object is what we're looking for - return it
        return true;
    }
    // if it's not what we're looking for and it's not an object return it
    if(typeof obj!== "object" || obj === null){
        return false;
    }
    for(var i in obj){ // check if it's any of its properties
        if(contains(obj[i],what)){
            return true; // found it in a child
        }
    }
   return false; // did not find it anywhere.
}
此外,必须有一个班轮:

function contains(obj,what){
    return (obj === what)||((typeof obj === "object" && obj !== null) &&  Object.keys(obj).some(function(el){return contains(obj[el],what);}));
}

澄清后,这里是一种递归方法,用于检查:

这里是一个小的实现

function contains(obj,what){
    if(obj === what){ 
        return true;
    }
    if(typeof obj!== "object" || obj === null){
        return false;
    }
    for(var i in obj){
        if(contains(obj[i],what)){
            return true;
        }
    }
   return false;
}
这适用于所有新旧浏览器,并且没有依赖关系。再次注明:

function contains(obj,what){
    if(obj === what){ // if the object is what we're looking for - return it
        return true;
    }
    // if it's not what we're looking for and it's not an object return it
    if(typeof obj!== "object" || obj === null){
        return false;
    }
    for(var i in obj){ // check if it's any of its properties
        if(contains(obj[i],what)){
            return true; // found it in a child
        }
    }
   return false; // did not find it anywhere.
}
此外,必须有一个班轮:

function contains(obj,what){
    return (obj === what)||((typeof obj === "object" && obj !== null) &&  Object.keys(obj).some(function(el){return contains(obj[el],what);}));
}

你是怎么找到亚历克斯的?就像您试图查找任何具有
name=x
的对象,或任何具有值
x
的属性的对象一样,它应该是
myObj.children[0]。children[1]。name
。我不知道这是否能回答你的问题。我正试图找到“亚历克斯”。这没有很好的定义。如果不止一个“Alex”呢?你想探索所有后代之树吗?如果对象是递归的(某个节点有一个祖先作为子节点),该怎么办?这只是我尝试使用的一个示例。在我的实现中,我将实际尝试过滤的是一个特定的技能集。例如,在下面的行中,我想搜索C++,然后显示C++节点下的所有条目/对象。@ BenjaminGruenbaum,因为这是专门搜索数据对象的文字,我不认为搜索原型是合适的。我认为这是为了向最终用户显示某些内容而进行的数据提取,我怀疑他们是否关心对象的内部工作。你是如何找到alex的?就像您试图查找任何具有
name=x
的对象,或任何具有值
x
的属性的对象一样,它应该是
myObj.children[0]。children[1]。name
。我不知道这是否能回答你的问题。我正试图找到“亚历克斯”。这没有很好的定义。如果不止一个“Alex”呢?你想探索所有后代之树吗?如果对象是递归的(某个节点有一个祖先作为子节点),该怎么办?这只是我尝试使用的一个示例。在我的实现中,我将实际尝试过滤的是一个特定的技能集。例如,在下面的行中,我想搜索C++,然后显示C++节点下的所有条目/对象。@ BenjaminGruenbaum,因为这是专门搜索数据对象的文字,我不认为搜索原型是合适的。我认为这是为了向最终用户显示某些内容而进行的数据提取,我怀疑他们是否关心对象的内部工作?看看你的jQuery代码,看看我的原生代码?即使我们忽略了较短的一行golfed版本。原生JS版本比jQuery版本可读性好得多,它更易于重用。我不相信“aweful类型系统”这一点——如果你用一种你必须知道的语言编写代码,那么缺乏语言类型系统的知识并不是包含80K LoC库的借口。你是认真学习这门语言的吗?看看你的jQuery代码,看看我的原生代码?即使我们忽略了较短的一行golfed版本。原生JS版本比jQuery版本可读性好得多,它更易于重用。我不相信“aweful类型系统”这一点——如果你用一种你必须知道的语言编写代码,那么缺乏语言类型系统的知识并不是包含80K LoC库的借口。改为学习语言。