2016-02-09 4 views
1

Я пытаюсь скопировать одно значение массива в другое, но без нарушения связей, связанных с этим массивом, другими словами я не могу просто назначить новый массив это значение, поэтому я не могу использовать такие методы, как slice() или concat(). Вот код функции, которая делает вещь:Длина массива javascript не изменяется после удаления элемента из него

self.updateBreadcrumbs = function (newBreadcrumbs) { 
      var old_length = self.breadcrumbs.length; 
      var new_length =newBreadcrumbs.length; 
      var j = new_length > old_length ? new_length: old_length; 

      for (var i = 0; i < j; i++) { 
       if(old_length < i+1){ 
        self.breadcrumbs.push(newBreadcrumbs[i]); 
        continue; 
       } 
       if(new_length < i+1){ 
        delete self.breadcrumbs[i]; 
        continue; 
       } 
       if (self.breadcrumbs[i].title !== newBreadcrumbs[i].title) { 
        self.breadcrumbs[i] = newBreadcrumbs[i]; 
       } 

      } 
     } 

Моя проблема заключается в том, что длина массива не изменяется, когда я что-то удалить из массива.

P.S Если вы знаете какой-либо более простой способ сделать это, я полностью открыт для предложений.

+2

Удаление элемента типа, который не должен изменять длину массива. – Pointy

+0

Вы удаляете объект, удерживаемый массивом. Массив остается незатронутым. –

+0

В чем смысл этой функции? Почему бы не просто «self.breadcrumbs = newBreadcrumbs»? – georg

ответ

8

Длина массива никогда не изменится, удалив элементы в нем.

Однако его можно изменить с помощью splice например.

var arr=[1,2,3,4,5]; //length 5 
arr.splice(0,1); //length 4 

В отличие от того, что предполагает общее убеждение, оператор delete не имеет ничего общего с непосредственно освобождая память. delete действует только на свойства объекта. Это не имеет никакого эффекта на длине массива

сплайсинга() метода изменяет содержимое массива путем удаления существующих элементов и/или добавления новых элементов.

Подробнее о Splice

+0

Но slice() вернет новый массив, не так ли, если в этом случае он не подходит в этом случае –

+1

Его ** сращивание ** не ** срез ** –

+0

yeh не заметил, большое спасибо ! –

2

length свойство Array объекта является свойством, которое поддерживается это методами, это не является неотъемлемой характеристикой самого объекта. Итак, если вы предпримете на него действие, которое не является одним из собственных методов Array, оно не будет обновлять свойство length. В этом случае вы должны использовать метод splice (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)

Интересно, что вы можете изменить состав массива, напрямую изменяя его длину. , , например, если у вас есть массив с 6 элементами в нем, и вы должны изменить его свойство length на 5 (то есть, array.length = 5;), он больше не будет распознавать 6-й элемент как часть массива.

Подробнее о length собственности: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length

Смежные вопросы