Array Slice(), изменяющий исходный массив

Я пытаюсь скопировать массив в новую переменную, а затем изменить массив.

Код:

    var test = [
        { test: "test1", arr: ["1", "2", "3"] },
        { test: "test2", arr: ["4", "5", "6"] }
    ];

    console.info("test before", test);
    console.info("test before", test[1]);
    console.info("test before", test[1].arr);

    var t2 =  [...test] // used .slice(0) but same result
    t2[1].arr = t2[1].arr.slice(0, 1);

    console.info("test after", test[1].arr);
    console.info("t2", t2[1].arr);

вывод:

test before:  
0: {test: "test1", arr: Array(3)} //arr: (3) ["1", "2", "3"]
1: {test: "test2", arr: Array(1)} // arr: (1) ["4"]

test before: 
{test: "test2", arr: Array(3)} //arr: (1) "4"

test before: (3) ["4", "5", "6"]

test after: ["4"]

t2: ["4"]

Как видите, оператор спреда/ slice() изменяет исходное значение.
Я также пытался использовать var t2 = Object.Create(test) [тот же результат].

@undefined Да, я хочу изменить t2[1].arr. Сначала у него было 3 элемента, но я хочу, чтобы в нем был только первый элемент, поэтому я делаю slice().

Prog_CS 31.01.2019 17:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
1 850
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы назначаете объект/массив переменной, он не копирует его. Я просто устанавливаю ссылку на исходный объект/массив. Вы должны использовать Object.assign для поверхностного клонирования и JSON.parse(JSON.stringify(obj)) для глубокого клонирования
Примечание: массивы на самом деле являются объектами в javascript

    var test = [
        { test: "test1", arr: ["1", "2", "3"] },
        { test: "test2", arr: ["4", "5", "6"] }
    ];
    
    console.info("test before", test);
    console.info("test before", test[1]);
    console.info("test before", test[1].arr);
    
    var t2 =  JSON.parse(JSON.stringify(test)) // used .slice(0) but same result
    t2[1].arr = t2[1].arr.slice(0, 1);
    
    console.info("test after", test[1].arr);
    console.info("t2", t2[1].arr);


However this JSON.parse(JOSN.stringify(obj)) is not much efficient and will give wrong output in some cases.

Использование jQuery

$.extend(true, {}, obj);

Использование лодаша

_.cloneDeep(value)

здесь Подробнее об этом можно узнать

Распространение массива (или Array.slice()) является лишь мелкой копией исходного массива, поэтому подобъект остается прежним.

Подробнее о глубоком копировании объектов см. здесь: Как вы клонируете массив объектов в Javascript?.

Другие вопросы по теме