在一个 JSON 对象中查找属性

3

我正在创建一个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');
}

向控制台输出NO

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

这段代码会在控制台打印出NO

因此,观察一下

typeof(tags.jane);

它显示它是一个"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对象?没有正确指定值吗?非常感谢任何建议。如果将其作为数组而不是对象更容易,我可以完全控制进行更改。只是有点困惑应该如何处理。


使用JSON.parse(jsonString)将服务器响应转换为JavaScript对象。 - Larry Battle
2
请提供一个详尽的演示,以获得+1的评分。 - user1106925
抱歉我没有提到我是在JS中解析JSON,但无论如何Sergio(和其他人)都给了我所需的东西。谢谢大家!出于好奇,为什么tags.jane和tags.jon是数组而不是“嵌套对象”,这在JSON中不可能吗?当我开始时,我想做一个检查,比如if(tags.jane.chicken),期望它返回true或false,如果属性存在。显然我需要阅读一些关于JSON对象的内容。:P 再次感谢所有发表意见的人。 - ocergynohtna
1
@ifonlythere weremorequestionslikethis :) - Sergio Tulentsev
1
@SergioTulentsev:同意。@@ocergynohtna:JSON有两种数据结构。一种是有序列表*(数组)*,其中键在标记中被排除,因为它们隐含着基于0的索引。另一种是键/值对的集合,其中键可以是任何字符串值。要获得tags.jane.chicken的行为,您需要将chicken用作键,并选择true(或另一个真值)作为值,并使用对象符号的{}语法。{"jon":{"beef":true,"pork":true},"jane":{"chicken":true,"lamb":true}} - user1106925
谢谢大家。我尽可能详尽地记录。这不仅是为了我自己,还为了其他开发人员寻找类似解决方案时更容易在查询中返回结果。 :) - ocergynohtna
5个回答

4

jQuery.inArray在元素未找到时返回-1。这是JavaScript的true值。请尝试以下操作:

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

3
你应该采用第二组答案。然而,$.inArray返回的是一个索引,而不是布尔值。任何非零整数都是true,这意味着当未找到'foo'时,它会返回-1,这会被评估为true并打印YES。
类似地,$.inArray('chicken', tags.jane)将返回0并转换为false,这也不是你想要的答案。
相反,使用$.inArray('foo', tags.jane) !== -1作为你的条件。

2

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


1

你正在错误地使用关键字in。 语句(prop 'in' obj)用于检查关联数组中是否存在值为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

你不能使用

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;
})();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接