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 对象?没有正确定位价值?任何意见是极大的赞赏。如果这更容易作为一个数组而不是一个对象,我可以完全控制它来改变它。我只是有点困惑我应该如何对待这个。

4

5 回答 5

4

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

if($.inArray('foo', tags.jane) != -1) {
于 2012-04-06T18:34:32.013 回答
3

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

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

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

于 2012-04-06T18:34:36.853 回答
2

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

于 2012-04-06T18:37:24.167 回答
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

于 2012-04-06T18:48:04.610 回答
0

你不能用

if('foo' in tags.jane))

它应该用作

if (1 in tags.jane)

如果你想检查 'foo' 在 tags.jane 中,试试这个

var inIt = (function() {
    var inIt = false;
    tags.jane.forEach(function(item) {
        inIt = inIt || 'foo' == item;
    });
    return inIt;
})();
于 2012-04-06T19:47:22.867 回答