Показать сообщение отдельно
  #3 (permalink)  
Старый 23.10.2019, 13:29
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от 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> Смотри в консоли

Последний раз редактировалось Malleys, 23.10.2019 в 13:35.
Ответить с цитированием