Javascript 在JSON对象中查找属性

Javascript 在JSON对象中查找属性,javascript,jquery,json,Javascript,Jquery,Json,我正在创建一个JSON对象,比如 tags = {"jon":["beef","pork"],"jane":["chicken","lamb"]}; 它是使用php从如下数组生成的 $arr = array( 'jon' => array('beef', 'pork'), 'jane' => array('chicken', 'lamb') ); $tags = json_encode($arr); 我想看看其中一个里面是否有东西。这

我正在创建一个JSON对象,比如

tags = {"jon":["beef","pork"],"jane":["chicken","lamb"]};
它是使用php从如下数组生成的

$arr = array(
        'jon' => array('beef', 'pork'),
        'jane' => array('chicken', 'lamb')
       );
$tags = json_encode($arr);
我想看看其中一个里面是否有东西。这些似乎都不管用,但有点像

if('lamb' in tags.jane)) {
    console.log('YES');
} else {
    console.log('NO');
}
写入控制台

if('foo' in tags.jane)) {
    console.log('YES');
} else {
    console.log('NO');
}
还向控制台写入

if('foo' in tags.jane)) {
    console.log('YES');
} else {
    console.log('NO');
}
那么看看

typeof(tags.jane);
它显示它是一个
“对象”
但是

console.log(tags);
显示以下内容:

Object
jane: Array[2]
    0: "chicken"
    1: "lamb"
    length: 2
    __proto__: Array[0]
jon: Array[2]
    0: "beef"
    1: "pork"
    length: 2
    __proto__: Array[0]
__proto__: Object
所以我想可能是
标签。jane
实际上可能是一个数组并尝试了

if($.inArray('lamb', tags.jane)) {
    console.log('YES');
} else {
    console.log('NO');
}
YES写入控制台,但

if($.inArray('foo', tags.jane)) {
    console.log('YES');
} else {
    console.log('NO');
}
还将写入控制台

我是否错误地构建了JSON对象?没有正确地确定价值目标?非常感谢您的建议。如果将其作为数组而不是对象更容易,那么我可以完全控制更改它。我只是有点困惑于如何处理这个问题。

当找不到元素时返回-1。这是Javascript POV中的
true
值。试试这个:

if($.inArray('foo', tags.jane) != -1) {

你的第二套答案是你应该走的路。但是,$.inArray返回的是索引,而不是布尔值。任何非零整数都为true,这意味着当未找到
foo
时,它返回-1,其计算结果为
true
,并打印YES

类似地,
$.inArray('chicken',tags.jane)
将返回
0
并强制转换为false,这也不是您想要的答案


相反,使用
$.inArray('foo',tags.jane)!=-1
作为您的条件。

tags.name将为您提供此人的数组。因此,
$.inArray(“chicken”,tags.jane)
将查看jane的标记数组中是否有“chicken”。如果不是,您将得到-1,否则您将得到它在数组中的位置(使用您的示例,这将返回零,第一个数组元素)。

您使用关键字in的原因是错误的。 语句(prop'in'obj)检查对象(关联数组)是否具有值为prop的属性。 由于在数组中使用“in”关键字,因此将返回false,因为tags.jane是一个具有索引的数组,而不是一个具有属性的关联数组

如果您想知道was值在数组中,请循环并比较。 如果要使用“in”关键字,请将数组转换为这样的对象

    tags = {};
    // old code
    tags.jane = ['lamb', 'food']; 
console.log(('lamb' in tags.jane) === false )
    // new code
    tags.jane = {
       'lamb':1,
        'food':1
    }
console.log(('lamb' in tags.jane) === true )
您不能使用

if('foo' in tags.jane))
它应该被用作

if (1 in tags.jane)
如果你想检查tags.jane中的'foo',试试这个

var inIt = (function() {
    var inIt = false;
    tags.jane.forEach(function(item) {
        inIt = inIt || 'foo' == item;
    });
    return inIt;
})();

使用JSON.parse(jsonString)将服务器响应转换为javascript对象。+1用于彻底演示您的尝试。抱歉,我没有提到我在js中解析JSON,但是Sergio(和其他人)提供了我所需要的。谢谢大家!出于好奇,为什么tags.jane和tags.jon是数组而不是“嵌套对象”,这在JSON中是不可能的吗?当我开始这样做的时候,我想我应该做一个检查,比如(tags.jane.chicken),如果属性存在,我希望它返回true或false。我显然需要对JSON对象进行一些阅读:P再次感谢所有插话的人。@amnotiam:要是还有更多这样的问题就好了:)@SergioTulentsev:同意@@ocergynohtna:JSON有2个数据结构。一种是有序列表(数组),其中键被排除在标记中,因为它们是隐式的基于0的索引。另一个是键/值对的集合,其中键可以是任何字符串值。要获得
标记.jane.chicken
行为,需要使用
chicken
作为键,选择
true
(或另一个truthy值)作为值,并使用
{}
语法作为对象表示法<代码>{“jon”:{“牛肉”:真的,“猪肉”:真的},“简”:{“鸡肉”:真的,“羔羊”:真的}