Сообщение от Andrew K
|
Написал функцию делающую неизменяемую копию
|
Цитата:
|
// Перебрать все элементы массива
for(let i = 0; i < newData.length; i++) {
// Если это объект
if(mainData + '' === "[object Object]") {
|
А кто будет отлавливать исключения?
Когда нет совпадения, что скопировать, то должен возвращаться исходный объект без изменении (не так ли?), а у вас выкидывает исключение!
Интересный способ проверки объекта путём приведения к примитиву! А если такое приведение не возможно, то выкидывает исключение!
Фактически вы ничего не меняете в объекте, зачем нам нужен новый объект, в котором ничего не изменено. Это очень не очевидное API, которое способствует ошибкам. Используйте immer, в котором происходит копирование только при реальных изменениях! В отличие от вашего небезопасного кода, в immer исходный объект не изменяется и при одинаковых аргументах, выдаётся одинаковый результат.
Вот пример...
<script src="https://unpkg.com/immer/dist/immer.umd.js"></script>
<script>
//Например есть массив arr_1. Требуется сделать его копию и
//изменить подмассив по адресу arr_1[2][2][1].
const arr_1 = [
0,
[1, 2, 3],
[ 4,
[5, 6],
[
[7, 8],
[ 9, 10 ]
],
]
];
//Поэтому в функцию immer.produce передаю ссылки на
//оригинальный массив и функцию, в которой изменяется
//подмассив. Функция возвращает копию реальных изменении.
const copy = immer.produce(arr_1, arr_1 => {
const link = arr_1[2][2][1];
// реально меняем подмассив
link.push(40);
});
console.log(copy);
//Можно сделать проверки
console.log(arr_1 === copy); // false
console.log(arr_1[1] === copy[1]); // true — массивы равны потому что он не будет затронут, поэтому нет смысла его копировать.
console.log(arr_1[2] === copy[2]); // false — массив был скопирован потому что является предком изменяемого массива
console.log(arr_1[2][2] === copy[2][2]); // false
console.log(arr_1[2][2][0] === copy[2][2][0]); // true
</script> Смотри в консоли