изменение значения массива изменение предыдущего клона этого массива - PullRequest
0 голосов
/ 03 декабря 2018

Функция f3 принимает массив простых объектов a в качестве параметра и возвращает массив, элементы которого являются копиями элементов массива a

почему, когда я делаю это утверждение b[0].a = 2; значение a[0].a; меняется на

это мой код

<script type="text/javascript">
    function f3(obj= [{a: 1, b: 'str'}]) {
        let r = [];
        for (let prop of Object.values(obj)){
            r.push(prop);
        }
        return(r);
    }


    const a = [{a: 1, b: 'str'}];
    console.log(a[0]);// output {a: 1, b: "str"}

    const b = f3(a); 
    console.log(b[0]);// output {a: 1, b: "str"}
    console.log(b[0].a);// output 1 

    b[0].a = 2;

    console.log(a[0]);// output {a: 2, b: "str"}
    console.log(b[0]);// output {a: 2, b: "str"}
    console.log(a[0].a);// output 2
    console.log(b[0].a);// output 2

</script>

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Предполагая, что объекты в вашем массиве совместимы с JSON (все значения свойств являются примитивами или вложенными массивами и объектами), вы можете клонировать массив с помощью json stringify / parse:

function f3(obj){
    return JSON.parse(JSON.stringify(obj));
}

Short.Просто.Работает как шарм.

0 голосов
/ 03 декабря 2018

Массив и Объект хранятся по ссылке.Поэтому, когда вы вносите изменения в любой ключ объекта или любой индекс массива, это будет влиять на обе переменные, потому что ссылка одна и та же.

В вашем случае const a = [{a: 1, b: 'str'}]; и const b = f3(a); обращаются к одной и той же ссылке,Вы передаете объект и возвращаете тот же объект ссылки.Попробуйте это с возвратом нового объекта.

Вы можете сделать это с помощью Object.assign () или новой функции ES6 Оператор Rest.

проверьте эту ссылку ниже - Оператор отдыха , Object.assign ()

Спасибо.

...