寻找

2012-04-06 65 views
3

我创建这是使用PHP从数组一样寻找

$arr = array(
     'jon' => array('beef', 'pork'), 
     'jane' => array('chicken', 'lamb') 
     ); 
$tags = json_encode($arr); 

产生像

tags = {"jon":["beef","pork"],"jane":["chicken","lamb"]}; 

一个JSON对象,我要检查,如果事情是在一个JSON对象的属性非此即彼。这些都不似乎工作,但像

if('lamb' in tags.jane)) { 
    console.log('YES'); 
} else { 
    console.log('NO'); 
} 

写道:NO控制台

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

还写道NO控制台

所以看着

typeof(tags.jane); 

it表明它是一个"object"

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 

,所以我想也许tags.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'); 
} 

也将YES写入控制台。

我错误地构建了JSON对象吗?没有正确定位价值?任何意见是极大的赞赏。如果这将作为一个数组而不是一个对象更容易,我完全可以控制它来改变它。我只是有点难以理解我应该如何对待这一点。

+0

使用JSON.parse(jsonString)将服务器响应转换为javascript对象。 – 2012-04-06 18:34:11

+2

+1,用于彻底展示您尝试的内容。 – 2012-04-06 18:41:52

+0

对不起,我没有提到我解析js中的JSON,但无论哪种方式,塞尔吉奥(和其他人)给了我我需要的东西。谢谢大家!出于好奇,为什么tags.jane和tags.jon数组而不是“嵌套对象”在JSON中是不可能的?当我开始这个时,我想我会做一个检查,如果(tags.jane.chicken)期望它返回true或false,如果该属性存在。我显然需要做一些阅读JSON对象。 :P再次感谢所有那些插话。 – ocergynohtna 2012-04-06 18:49:59

回答

4

jQuery.inArray当找不到元素时返回-1。这是来自Javascript的POV的值true。试试这个:

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

你的第二套答案是你应该去的方式。但是,$ .inArray返回一个索引,而不是布尔值。任何非零整数都为真,这意味着如果foo未找到,则返回-1,其结果为true并打印YES

同样,$.inArray('chicken', tags.jane)将返回0并转换为false,这也不是您想要的答案。

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

+0

+1为“0 is false”:) – 2012-04-06 18:40:23

2

tags.name会给你这个人的数组。因此$.inArray("chicken",tags.jane)会查看“鸡”是否在jane的标签数组中。如果不是,你会得到-1,否则你会在数组中的位置(使用你的例子,这将返回零,第一个数组元素)。

1

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

如果你想知道值是在数组中然后循环和比较。 如果你想使用'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) 

https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in

+0

ahhhhh !!奇妙!感谢拉里。 – ocergynohtna 2012-04-06 19:29:05

0

不能使用

if('foo' in tags.jane)) 

它应该被用来作为

if (1 in tags.jane) 

,如果你想检查 '富' 是tags.jane,尝试这

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