JQuery $ .extend не работает так, как я ожидал: как правильно это кодировать? - PullRequest
1 голос
/ 06 ноября 2010

Здесь - это страница расширения JQuery.

Я ожидал бы, что это возьмет два массива, соединит их вместе и создаст одинаковые свойства для каждого полученного элемента массива. Как мне заставить это работать как ожидалось?

var a = [];
a.push({ "id": 1, "text": "one" });
a.push({ "id": 2, "text": "two" });
a.push({ "id": 3, "text": "three" });
var b = [];
b.push({"id":3 , "selected":true});
var c = [];
$.extend(c,a,b);

Я ожидаю, что результирующий массив будет содержать:

{ "id": 1, "text": "one", "selected": false }
{ "id": 2, "text": "two", "selected": false }
{ "id": 3, "text": "three", "selected": true }

но вместо этого кажется, что он просто копирует первый массив поверх второго:

{ "id": 3, "text": null, "selected": true }
{ "id": 2, "text": "two" }
{ "id": 3, "text": "three" }

Документация включает в себя:

Когда мы предоставляем два или более объектов в $ .extend (), свойства всех объектов добавляются к целевому объекту.

Что я делаю не так или как бы я поступил иначе?

РЕДАКТИРОВАТЬ: Реализация предложения Jball:

var a = [];
a.push({ "id": 1, "text": "one" });
a.push({ "id": 2, "text": "two" });
a.push({ "id": 3, "text": "three" });
var b = [];
b.push({ "id": 3, "selected": true });
var c = [];
for (var index = 0; index < a.length; index++) {
   var tempresult = {};
   var tempb = b.filter(
      function (ele, idx, collection) {
         return (collection[idx].id == index + 1);
      });
   if (tempb.length == 0)
      tempb = [{ "id": index + 1, "selected": false }];
   $.extend(tempresult, a[index], tempb[0]);
   c.push(tempresult);
} 

производит:

[{"id":1, "selected":false, "text": "one"},
 {"id":2, "selected":false, "text": "two"},
 {"id":3, "selected":true,  "text": "three"}]

Это ответ. Теперь мне интересно, можно ли его немного почистить.

1 Ответ

1 голос
/ 06 ноября 2010

Я не уверен, что вы заметили это, но функция $.extend() предназначена для свойств объектов, а не элементов массива.

Похоже, вам нужно создать функцию для циклического перемещения по массивам и вызвать $.extend() для соответствующих элементов, чтобы получить желаемый результат.Вы должны решить, хотите ли вы добавить или игнорировать несоответствующие элементы из второго массива.

Проблема в том, что jQuery не знает, какие элементы в вашем массиве совпадают, и поэтому сопоставляет их по индексу, хотя я не уверен, почему результат для первого элемента имеет "text": "three" вместо "text": "one", если только он не пытается сопоставить по свойствам отдельных элементов после того, как он $.extend() основывается на индексе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...