【问题标题】:Detect how many elements have changed in JSON array with jQuery使用jQuery检测JSON数组中有多少元素发生了变化
【发布时间】:2014-06-26 20:16:40
【问题描述】:

我对 Web 开发非常陌生,所以这对您来说可能看起来很简单:

我正在建造一堵墙,展示 100 幅微型风景图片的马赛克。我从仅包含 100 张最新上传的图片的远程 JSON 中获取这些图片的 URL,从最近的开始。该 JSON 会不断更新。

JSON 结构:

[
{
    "name": "Blue Mountains",
    "url": "http://foo.com/url-to-picture", // <- Most recent
    "location": "Canada"
},
{
    "name": "Yellow Lake",
    "url": "http://foo.com/url-to-picture", // <- Second most recent
    "location": "Greece"
}, ...
]

我想每 10 秒检查一次 JSON 并检测是否已上传新图片,如果是,我想知道有多少,然后用新图片替换墙上最旧的图片。

我真正能想到的是:

function getNewPictures() {
    $.getJSON("http://bar.com/url-to-json", function(result) {
        latest100 = result;
        checkIfNewPictures(); // I don't know how to do this
        old100 = latest100;
    });
}

setInterval(getNewPictures, 10000);

如您所见,我不知道如何比较 old100 和 latest100。我还想如果我可以将 X 新图片存储到另一个数组中对我来说会更容易,这样更新墙的过程会更容易。

实现这一目标最实用的方法是什么?

谢谢!

【问题讨论】:

  • 你应该使用 Backbone.js :)
  • 感谢您的提示。然而,正如我所说,我对 Web 开发非常陌生,我想尽可能多地学习而不依赖太多框架,这样我就可以了解我所做工作背后的逻辑。 :-)

标签: javascript jquery arrays json comparison


【解决方案1】:

有几种方法可以解决,但我会这样做。

您正在使用的数据结构似乎不包含每张图片的唯一标识符。您需要一种方法来唯一标识每张图片,因此您必须创建一些东西。

假设您最初像这样输出图像:

$.getJSON("http://bar.com/url-to-json", function(result) {
    $.each(result, function(index, picture) {
        $('.wrapper').append("<img class='json-image' src='" + picture.url + "'/>");
    });
});

您还需要为每个元素指定一个唯一标识符,以便对其进行引用。

    ...
    $.each(result, function(index, picture) {
        var pictureID = picture.name + 'something' + picture.location;
        pictureID = pictureID.replace(' ','');
        $('wrapper').append("<img class='json-image' src='" + picture.url + "' id='" + pictureID + "'/>");
    });
    ...

这是一个功能,用于删除不在最新 json 中的图像。

function removeImages(json) {
    var newImageIDs = [];
    $.each(json, function(index, picture) {
        //make an array of all the new image ID's
        var pictureID = picture.name + 'something' + picture.location;
        pictureID.replace(' ','');
        newImageIDs.push(pictureID);
    });

    $('.json-image').each(function() {
        if ( newImageIDs.indexOf($(this).attr('id')) < 0 ) {
            //this image is no longer in the json, remove it
            $(this).remove();           
        }
    });
}

现在,当您获得最新的 JSON 时,您可以添加新的 JSON 并删除不再存在的 JSON。

$.getJSON("http://bar.com/url-to-json", function (result) {
    $.each(result, function (index, picture) {
        var pictureID = encodeURIComponent(picture.name + 'something' + picture.location);
        //only add new images
        if ( !$('#' + pictureID).length ) {
            $('.wrapper').append("<img class='json-image' src='" + picture.url + "' id='" + pictureID + "'/>");
        } 
    });
    removeImages(result);
});

【讨论】:

  • 感谢您的回答!我认为它可能适用于我非常具体的问题。但是,这段代码似乎不会真正比较新的 JSON 和旧的 JSON?对于我自己的学习,有没有办法做到这一点?是否可以将存在于新 JSON 中但存在于旧 JSON 中的图片的 URL 存储在数组中?
  • 另外,看来我可以在我的请求中要求每张图片的唯一标识符,它会为每张图片返回一个 ID。但是,ID 不会相互跟随:最近的照片的 ID 可以小于第二最近的照片。
  • 基本上你是在比较新旧。旧数据直接反映在 DOM 中,因为您正在为每个对象创建一个元素 (img)。
猜你喜欢
  • 2013-05-29
  • 2015-02-16
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2020-01-18
  • 2013-08-03
相关资源
最近更新 更多