Задать вопрос
sM0kfyz
@sM0kfyz
Frontend dev.

JavaScript клонирование массива. Почему браузер виснет?

function cloneArray(mas) {
	var masClone = new Array();
	for(i = 0; i < mas.length; i++) {
		masClone.push(mas[i]);
		for(j = 0; j < mas[i].length; j++) {
			masClone[i].push(mas[i][j]);
		}
	}
	return masClone;
}

var s1 = 0;
var s2 = 1;
var d1 = 1;
var d2 = 0;

var mass1 = [ 
s = [s1, s2],
d = [d1, d2]
];

var mass2 = cloneArray(mass1);

Вот такой код. Никак не могу понять почему браузер виснет, понятно что из-за цикла, но все же вроде бы правильно.
  • Вопрос задан
  • 701 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@iShatokhin
JS developer
Какая-то непонятная мне магия тут...

var mass1 = [ 
s = [s1, s2],
d = [d1, d2]
];


Вот правильный вариант глубокого копирования (пример и сравнение с другими решениями jsfiddle.net/0yseqsuy):

var isArray = Array.isArray || function (arr) {
  return Object.prototype.toString.call(arr) === "[object Array]";
}

var isObject = function (obj) {
  return Object.prototype.toString.call(obj) === "[object Object]";
}

function cloneDeep(mas) {
  var masClone = isArray(mas) ? new Array(mas.length) : {};   
  
  Object.keys(mas).forEach(function (key) {
    if (isArray(mas[key]) || isObject(mas[key]))
      masClone[key] = cloneDeep(mas[key]);
    else
      masClone[key] = mas[key];
  });

  return masClone;
}

Но для старых браузеров нужны полифилы Object.keys и forEach.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы