JSON对象 - >阵列?我应该怎么转换它?

时间:2011-05-31 10:23:23

标签: javascript jquery ajax json

拿两个:)我有一个jquery的autocomplete texbox,点击一个按钮,我需要检查输入的值是来自自动完成还是一个全新的值。

问题是'cache'是某种JSON对象的数组,但是能够使用 if(在缓存中输入){...} 我需要将其转换为简单的javascript数组。最好的方法是什么?

P.S。 FireBug说'cache = [object Object]'

//////////////////////////////////////////// autocomplete code //////////////////
    var cache = {},
        lastXhr;
    $( "#inputV" ).autocomplete({
        minLength: 2,
        source: function( request, response ) {
            var term = request.term;
            if ( term in cache ) {
                response( cache[ term ] );
                return;
            }

            lastXhr = $.getJSON( "search.php", request, function( data, status, xhr ) {
                cache[ term ] = data;
                if ( xhr === lastXhr ) {
                    response( data );
                }
            });
        }
    });


////////////////////////// check if input comes from autocomplete  //////////////////
    $('#btn_check').click(function()        {

        var input = $("#inputV").val();
        alert(input);

        console.log('cache='+cache); 
        /// FireBug says 'cache=[object Object]'

        if ( input in cache ) 
            {
                alert("yes");
             }  
            else
            {
                alert("no");
            }   
    });

这是响应的样子。

[
    {
        "id": "Podiceps nigricollis",
        "label": "Black-necked Grebe",
        "value": "Black-necked Grebe"
    },
    {
        "id": "Nycticorax nycticorax",
        "label": "Black-crowned Night Heron",
        "value": "Black-crowned Night Heron"
    },
    {
        "id": "Tetrao tetrix",
        "label": "Black Grouse",
        "value": "Black Grouse"
    },
    {
        "id": "Limosa limosa",
        "label": "Black-tailed Godwit",
        "value": "Black-tailed Godwit"
    },
    {
            "id": "Chlidonias niger",
        "label": "Black Tern",
        "value": "Black Tern"
    },
    {
        "id": "Larus marinus",
        "label": "Great Black-backed Gull",
        "value": "Great Black-backed Gull"
    },
    {
        "id": "Larus fuscus",
        "label": "Lesser Black-backed Gull",
        "value": "Lesser Black-backed Gull"
    },
    {
        "id": "Larus ridibundus",
        "label": "Black-headed Gull",
        "value": "Black-headed Gull"
    },
    {
        "id": "Turdus merula",
        "label": "Common Blackbird",
        "value": "Common Blackbird"
    },
    {
        "id": "Sylvia atricapilla",
        "label": "Blackcap",
        "value": "Blackcap"
    },
    {
        "id": "Rissa tridactyla",
        "label": "Black-legged Kittiwake",
        "value": "Black-legged Kittiwake"
    },
    {
        "id": "Aegypius monachus",
        "label": "Eurasian Black Vulture",
        "value": "Eurasian Black Vulture"
    }
]

2 个答案:

答案 0 :(得分:2)

(替换答案,我并不是说最后一个成为CW。)

  

问题是'cache'是某种JSON对象数组

实际上,它不是一个阵列。这是一个对象。 (它是通过var cache = {};创建的,这是我们可以告诉的方式。)

  

...但是为了能够使用if ( input in cache ) { ... }我需要将其转换为简单的javascript数组。

实际上,没有。此上下文中的in运算符将测试对象是否包含具有您提供的名称的属性。例如:

var obj = {foo: 1};  // An object with a property called "foo"
alert('foo' in obj); // alerts true, `obj` has a "foo" property
alert('bar' in obj); // alerts false, there is no "bar" property in `obj`

请注意,in运算符的左侧必须是字符串(它可以是文字,如上所述,或任何导致字符串的表达式,例如变量引用)。

click处理程序中的代码将获取“inputV”字段的值,并查看该值是否为cache对象中属性的名称。

您可能想要检查它是否是cache对象的某个属性的。如果是这样的话:

$('#btn_check').click(function()        {

    var input = $("#inputV").val();
    var found, propName;

    alert(input);

    console.log('cache='+cache); 
    /// FireBug says 'cache=[object Object]'

    found = false;
    for (propName in cache ) {
        if (cache[propName] == input) {
            found = true;
            break;
        }
    }
    alert(found);
});

因为我们知道cache是一个无聊的旧对象(从它使用var cache = {};创建的事实),我们可以非常安全地使用上面的原始for..in循环。但是如果你想要更加小心,你可以使用hasOwnProperty来确保你只检查cache有自己的副本(而不是它从原型继承的那些)的行为:

    for (propName in cache ) {
        if (cache.hasOwnProperty(propName) && cache[propName] == input) {
            found = true;
            break;
        }
    }

但是,在这种情况下,它并不是真的有必要,因为我们知道cache是一个普通的对象,并禁止有人做一些非常愚蠢的事情,比如扩展Object.prototype(你不应该这样做) ,它的所有可枚举属性(for..in枚举的东西)都是它自己的属性。

答案 1 :(得分:0)

如果没有看到JSON的样子,很难分辨。您可以将if ( input in cache )替换为if(cache.hasOwnProperty(input))而不用将其转换为数组,但这取决于缓存对象包含的内容。