2014-10-25 3 views
2

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

Я попытался «.concat()», я использовал «для» для копирования каждого элемента отдельно, но каждый раз, когда я делал изменения во временном массиве, тоже менялся исходный массив.

Вот код.

Glossary: 
tablicaZnacznikow - original array 
placeholder - temporary array 
tempClosest - id of closest marker 
startingPointID - id of marker from witch i start calculation 
.meta field - defines if marker has been added to polyline 

var placeholder = tablicaZnacznikow.concat(); 
      var tempArrayOfSomething = [placeholder[startingPointID].latLng]; 
      for (var i = 0; i < placeholder.length; i++) { 
       var tempClosest = findClosestMarkerToAnotherMarker(placeholder, startingPointID); 
       tempArrayOfSomething.push(placeholder[tempClosest].latLng); 
       startingPointID = tempClosest; 
       placeholder[tempClosest].meta = "USED"; 
       console.log(tempClosest); 
      } 

Этот код используется для создания массива для создания пути для полилинии gMap3. Спасибо заранее.

+1

Если присвоить объект другой переменной, вы не клонирования объекта, вместо этого, обе переменные будет содержать ту же ссылку на одни и те же данные в памяти. Поэтому вы должны клонировать объекты. См. Http://stackoverflow.com/q/122102/1529630 и http://stackoverflow.com/q/728360/1529630 – Oriol

ответ

2

Для клонирования массива объектов вы можете просто использовать метод map и вернуть копию объекта на каждой итерации. Очень удобно, что создание копии объекта очень просто с $.extend. Все вместе:

var newArr = tablicaZnacznikow.map(function(el) { 
    return $.extend({}, el); 
}); 

или еще короче:

var newArr = tablicaZnacznikow.map($.extend.bind(null, {})); 

Вот так. map создает новый массив, а $.extend клонирует объекты. Вы получаете клонированный массив объектов.

Примечание: Я использовал два метода ES5, которые поддерживаются IE9 +. Если вы также поддерживаете старые IE, просто используйте $.map вместо Array.prototype.map и $.proxy вместо Array.prototype.bind.

+0

Я пробовал, и каждый объект в новом массиве содержит копию исходного массива .... – Haito

+0

Can вы отправляете пример своего массива, который хотите скопировать? Похоже, я смутился, и вам нужно скопировать 'tablicaZnacznikow'. В этом случае попробуйте 'tablicaZnacznikow.map (function (el) {...});'. – dfsq

+0

Да, я понял, и все работает отлично. – Haito

0

Все, что вам нужно сделать, это сделать глубокую копию вашего массива (например, с JQuery):

var placeholder = $.extend(true, [], tablicaZnacznikow);