jQuery .extend () и .merge () дают странные результаты внутри автозаполнения - PullRequest
1 голос
/ 29 июня 2011

Я попытался использовать слияние и расширение для объединения массивов внутри опции ajax для автозаполнения - виджета пользовательского интерфейса автозаполнения jQuery.Они оба работают, но не так, как они должны.В приведенном ниже коде с использованием extend () в раскрывающемся списке отображается только содержимое objectB.Если я переверну порядок аргументов, отобразится только objectA, т.е. отобразится второй аргумент, но не комбинация с первым.Когда я изменяю его на слияние (objectA, objectB), отображается только содержимое objectA.При использовании merge () отображается только первый аргумент, но не комбинация обоих.Как получить объединенное содержимое обоих массивов для отображения?(В конце концов, objectB будет совершенно другим, но я просто пытаюсь заставить концепцию работать.)

            $.ajax(
            {
                url: "http://ws.geonames.org/searchJSON",
                dataType: "jsonp",
                data: geonamesData,
                success: function( data )
                {   var objectA=null;
                    var objectB=null;
                    var objectC=null;
                    response( $.map( data.geonames, function( item )
                    { objectA={
                                label: item.name + (item.adminName2 ? ", " + item.adminName2 : "") + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                                value: item.name + (item.adminName2 ? ", " + item.adminName2 : "") + (item.adminName1 ? ", " + item.adminName1 : ""),
                                name: item.name   
                              };
                      objectB={
                                label: item.name + (item.adminName2 ? ", " + item.adminName2 : ""),
                                value: item.name + (item.adminName2 ? ", " + item.adminName2 : ""),
                                name: item.name
                               };
                      objectC=$.extend({},objectA, objectB);
                      return objectC;
                    }));
                }
            });

1 Ответ

2 голосов
/ 29 июня 2011

$.extend имеет дело со свойствами - объединяет свойства влево.То есть любые свойства, появляющиеся в аргументе «правильнее», будут переопределять все свойства с одинаковыми именами, присутствующие в любом аргументе «lefter».(Результатом является один объект, который является тем же объектом, что и первый параметр: первый входной объект мутировал ).

$.merge можно представить как "concat" -- но смотрите примечание - так как он объединяет два массива (или массива, как вещи) вместе.(В результате получается один массив, который является тем же объектом, что и первый параметр: первый входной массив имеет вид мутировал .)

Если вы хотите получить коллекцию элементов, верните коллекциюэлементы (обычно массив).

Например, return [objectA, objectB].

Удачного кодирования.

...