Javascript 在JSON对象中查找属性
我正在创建一个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); 我想看看其中一个里面是否有东西。这
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”:{“牛肉”:真的,“猪肉”:真的},“简”:{“鸡肉”:真的,“羔羊”:真的}