从自动完成结果中删除重复项Json

时间:2013-07-04 16:25:55

标签: javascript jquery ajax json

我有一个问题,我添加了两个要素类,这意味着我有时会得到在autosuggest中重复的结果。我想知道是否有一种方法可以检查重复项并获取替代方法,而不是两次显示相同的结果。

这是我的代码(工作):http://jsfiddle.net/spadez/nHgMX/4/

  $(function() {
      jQuery.ajaxSettings.traditional = true; 
    function log( message ) {
      $( "<div>" ).text( message ).prependTo( "#log" );
      $( "#log" ).scrollTop( 0 );
    }

    $( "#city" ).autocomplete({
      source: function( request, response ) {
 $.ajax({
          url: "http://ws.geonames.org/searchJSON",
          dataType: "jsonp",
       data: {
        featureClass: ["A","P"],
        style: "full",
        maxRows: 7,
        name_startsWith: request.term,
        country: "UK"
      },           
          success: function( data ) {
            response( $.map( data.geonames, function( item ) {
              return {
                label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                value: item.name
              }
            }));
          }
        });
      },
      minLength: 1,
      select: function( event, ui ) {
        log( ui.item ?
          "Selected: " + ui.item.label :
          "Nothing selected, input was " + this.value);
      },
      open: function() {
        $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
      },
      close: function() {
        $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
      }
    });
  });

非常感谢任何帮助或信息

3 个答案:

答案 0 :(得分:3)

很难确切地说出你在问什么。但是要从对象数组中删除重复项,可以使用下划线的_.uniq()

 $.map( _.uniq(data.geonames, false, function(o){return o.adminName1})

Here's a jsfiddle不显示重复项。但同样,很难说出你的结构究竟有什么重复,但这段代码应该让你朝着正确的方向前进

你没有使用下划线,你自己实现uniq非常容易,只需看看azcn2503's answer

答案 1 :(得分:2)

如果您的ajax调用返回的值为response的数组,则可以通过插件运行它以删除重复的条目。这是我在不久的某个地方找到的插件。

function ArrayNoDupes(array) {
    var temp = {};
    for (var i = 0; i < array.length; i++)
        temp[array[i].value] = true;
    var r = [];
    for (var k in temp)
        r.push(k);
    return r;
}

我可能会弄错,但您可以通过更改以下行来将其实现到现有代码中:

source: function( ArrayNoDupes(request), response )

编辑:根据Juan Mendes的评论更新了功能

答案 2 :(得分:2)

我稍微修改了代码,以便它执行以下操作:

  1. 将所有自动填充条目放入对象中,并将自动填充值作为键
  2. 将此对象重新转换为数组并将其返回
  3. 通过这样做,任何重复的键只会覆盖前一个键。

    success函数现在看起来像这样:

    success: function( data ) {
        var x = $.map( data.geonames, function( item ) {
            return {
                label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                value: item.name
            }
        });
    
        // Create an object to easily filter out duplicates (key of same name will simply be reused)
        var x2 = {};
        for(var i in x) {
            x2[x[i].value] = x[i];
        }
    
        // Create a new array that simply converts the object in to a de-duplicated array
        var x3 = [];
        for(var i in x2) {
            x3.push(x2[i]);
        }
    
        // Return the array
        response(x3);
    }
    

    我已经对它进行了测试,它似乎正在运行,虽然你首先出现的重复项问题不是我可以复制的。

    更新了小提琴:http://jsfiddle.net/nHgMX/8/