在运行之前确定数据是否是新的(使用JSON比较数组)

时间:2012-06-11 14:15:11

标签: javascript jquery arrays compare

好吧,我有一个有趣的问题。我的页面每隔一段时间发出一次JSON请求。如果数据没有改变,则不需要做任何事情。问题是,我无法找到一种方法来证明它是否已经改变。

我尝试过这样的事情无济于事:

var stations = null;

function parseDynamicData(ard) {
    //this was something that gave me problems for days
    //nice little hack to fix it
    if (ard['details']['enabled'] == 'true' && ard['song']['art'] != 'undefined');
    {
        //turns off the 'server offline' page
        if (document.location.toString().indexOf('#offline') != -1)
            document.location = '/#tracks';
        //update UI
        $('#track-title').html(htmlDecode(ard['song']['title']));
        $('#track-artist').html(htmlDecode(ard['song']['artist']));
        $('#track-album').html(htmlDecode(ard['song']['album']));
        $('#track-art').attr('src', htmlDecode(ard['song']['art']));
        //set if it's play or pause visible
        if (htmlDecode(ard['details']['playing']) == 'true') {
            $('#control-pauseplay').html('Pause');
            $('#control-pauseplay').attr('href', '/track?proc=2');
        } else {
            $('#control-pauseplay').html('Play');
            $('#control-pauseplay').attr('href', '/track?proc=3');
        }
        //Now update all of the stations
        if (stations == null || stations != ard['stations']) {
            $.each(ard['stations'], function (key, value) {
                alert(key);
            });
            stations = ard['stations'];
        }
    }
}

以下是正常的JSON响应:

{
    "song": {
        "art": "http://cont-sjl-1.pandora.com/images/public/amz/6/2/3/3/886978533326_500W_500H.jpg",
        "title": "Hold It Against Me",
        "artist": "Britney Spears",
        "album": "Femme Fatale Deluxe"
    },
    "details": {
        "playing": "true",
        "enabled": "true"
    },
    "stations": {
        "undefined": "False",
        "Alex Clare Radio": "False",
        "Rap Strength Training Radio": "False",
        "Drops Of Jupiter Radio": "False",
        "Tween Radio": "False",
        "Today's Hits Radio": "True"
    }
}

无论我做什么,它仍然会通过JSON为每个键发出警报。有人知道我应该做什么吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用JSON.Stringify吗?显然,您从JSON请求中获得的是JSON,我假设您已将最后一个请求转换为实际的Object。所以请致电:

JSON.Stringify(Object) === JSONresult

并比较两个字符串。

答案 1 :(得分:1)

我怀疑stationsard['stations']是结构相同的不同对象。如果您在每个JSON请求后重建ardstations保留上一个 ard中的数组,那么这两个对象不是同一个对象,因此无论对象是否具有相同的键值对,完全匹配都将失败。

我要做的是保留最后一条JSON消息的完全字符串副本,并在解析它之前将其与当前的JSON字符串消息进行比较。否则,您需要将当前对象的每个键值对与预期的新对象进行比较 - 如果其中一些值本身就是对象,那么事情可能会变得有点(不必要)毛茸茸。

如果您可以确定服务器将始终以相同的方式对给定对象 O 进行字符串化(并且您无需担心检查客户端上的对象是否< / em>已经发生变异),然后您可以简单地比较服务器中对象的JSON字符串版本。