Рассмотрим следующий пример:
var ar = [4, 2, 3];
ar.$x = 'something';
var br = angular.copy(ar);
console.dir(br);
br
больше не имеет свойства $x
, потому что при копировании массива angular повторяется с for (;;;)
, который не видит пользовательских свойств (если он повторяется с for in
, тогда он будет работать ) .
Что из следующего я должен сделать?
- Создать массив как класс, а затем назначить свойство;
- Если это ошибка, сообщите об этом в angular;
- Измените мой код, потому что присвоение свойства массиву не является хорошей практикой;
3 ответа
Попробуйте angular.merge () Это глубокая копия, которая включает перечисляемые свойства.
var ar = [4, 2, 3];
ar.$x = 'something';
var br = angular.merge([], ar);
console.dir(br);
Выход
Array[3]
0: 4
1: 2
2: 3
$x: "something"
length: 3
__proto__: Array[0]
Попробуйте использовать jQuery:
JQuery.extend ([], ar);
var ar = [4, 2, 3];
ar.$x = 'something';
var br = jQuery.extend([], ar);
console.dir(br);
Я думаю, что это не угловая проблема. Если вы называете такое заявление:
ar.$x = 'something';
console.log(Object.prototype.toString.call(ar));
Вы увидите, что [object Array]
будет зарегистрирован. Вот как работает метод Array.isArray()
, и, в свою очередь, именно так метод angular copy()
решает, как перебрать сущность, переданную в качестве аргумента. Это обнаружение является важным циклом beacuse for ... in
в массиве, что может привести к путанице в других случаях. Здесь описывается почему: Почему используется "для ... в" с итерацией массива - плохая идея?
Я бы посоветовал вам изменить код для этого конкретного случая.
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.