1

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

这是我的代码(工作):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" );
      }
    });
  });

任何帮助或信息将不胜感激

4

3 回答 3

3

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

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

这是一个不显示重复项的 jsfiddle 。但同样,很难从你的结构中分辨出真正的重复是什么,但这段代码应该会让你朝着正确的方向前进

你没有使用下划线,自己实现uniq真的很容易,看看azcn2503的回答

于 2013-07-04T16:47:43.443 回答
2

如果您的 ajax 调用返回一个包含该值的数组response,您可以通过插件运行它以删除重复条目。这是我不久前在另一个 SO 线程上找到的插件。

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 )

编辑:根据胡安门德斯的评论更新功能

于 2013-07-04T16:30:44.883 回答
2

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

  1. 将所有自动完成条目放入一个对象中,以自动完成值作为键
  2. 将此对象转换回数组并返回

通过这样做,任何重复的键都会简单地覆盖前一个键。

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/

于 2013-07-04T16:48:29.910 回答