При решении задач в массиве в JavaScript. Мы можем столкнуться с ошибками в методе push для добавления элемента. Здесь проблема возникает, когда мы создаем/разрабатываем что-то на JavaScript или React.

Давайте проанализируем побочные эффекты метода Push на двух примерах:

Я покажу код небольшими фрагментами. Чтоб все поняли.

Пример — 1

function push(a) {
    b = a;
    b.push(4);
    console.log("Duplicate- ", b);
}

const a = [1,2,3];

push(a); //Output:- Duplicate- [1, 2, 3, 4]

//What if I console.log(a) after a function call?

console.log("original", a); //Output:- original- [1, 2, 3, 4]

Как мы видим, используя метод push. Исходный массив изменяется. Если мы не хотим изменять исходный массив, каковы возможные способы решения этого побочного эффекта? ?

Решение для примера — 1

Мы будем использовать оператор распространения, чтобы устранить этот побочный эффект.

function push(a) {

    const b = [...a, 4] //Using [spread operator, 4] to append an element.

    console.log(b)
}

const a = [1,2,3]

push(a) //Output:- Duplicate- [1, 2, 3, 4]

//What if I console.log(a) after a function call?

console.log("original", a) //Output:- original- [1, 2, 3]

Подумайте об этом, вы создаете сайт электронной коммерции. Где вам нужно добавить товар в корзину. В то время, почему вам следует избегать использования метода push?

Я объясню это на примере. Так что это будет иметь больше смысла.

Пример ниже взят с сайта educative.io, но комментарии написаны мной.

Пример — 2

//Array of objects
//3 items inside the original array.
const cart = [
{
    name: 'The Foundation Trilogy',
    price: 19.99,
    discount: false,
},
{
    name: 'Godel, Escher, Bach',
    price: 15.99,
    discount: false,
},
{
    name: 'Red Mars',
    price: 5.99,
    discount: true,
}, ];
const reward = {
    name: 'Guide to Science Fiction',
    discount: true,
    price: 0,
};
function addFreeGift(cart) {
    if (cart.length > 2) {
        cart.push(reward)
        return cart
    }
    return cart;
}
function summarizeCart(cart) {

    const cartWithReward = addFreeGift(cart);

    // return output of addFreeGit(cart) get stored in the CartWithReward

    console.log(cartWithReward)

    const discountable = cart.filter(item=>item.discount);

    // discountable = [ {discount: true }, {discount: true} ]

    if (discountable.length > 1) {
        return {
            error: 'Can only have one discount',
        };
    }

    return {
        discounts: discountable.length,
        items: cartWithReward.length,
        cart: cartWithReward,
    };
}
console.log("Add free gift:");
console.log(addFreeGift(cart));
console.log("\n");
console.log("Summarize cart:");
console.log(summarizeCart(cart));
console.log("\n");
console.log("Cart:");
console.log(cart);

Вывод для приведенного выше кода —

//Output
Add free gift:

0:{name: 'The Foundation Trilogy', price: 19.99, discount: false}

1: {name: 'Godel, Escher, Bach', price: 15.99, discount: false}

2: {name: 'Red Mars', price: 5.99, discount: true}

3: {name: 'Guide to Science Fiction', discount: true, price: 0}

4: {name: 'Guide to Science Fiction', discount: true, price: 0}
//Output 
Summarize cart:

0:{name: 'The Foundation Trilogy', price: 19.99, discount: false}

1: {name: 'Godel, Escher, Bach', price: 15.99, discount: false}

2: {name: 'Red Mars', price: 5.99, discount: true}

3: {name: 'Guide to Science Fiction', discount: true, price: 0}

4: {name: 'Guide to Science Fiction', discount: true, price: 0}

{error: 'Can only have one discount'}
//Output 

Cart:

0:{name: 'The Foundation Trilogy', price: 19.99, discount: false}

1: {name: 'Godel, Escher, Bach', price: 15.99, discount: false}

2: {name: 'Red Mars', price: 5.99, discount: true}

3: {name: 'Guide to Science Fiction', discount: true, price: 0}

4: {name: 'Guide to Science Fiction', discount: true, price: 0}

Из приведенного выше наблюдения мы можем сделать вывод, что результаты операций Добавить бесплатный подарок, Обобщить корзину и Корзина побочные эффекты. Когда одни и те же товары добавляются дважды, а товары в исходной корзине также изменяются.

Мы можем избежать этих побочных эффектов, используя sоператор pread внутри этой функции addFreeGift в корзине. .

function addFreeGift(cart) {
    if (cart.length > 2) {
        //Earlier it was cart.push(reward)
        cart = [...cart, reward]
        return cart
    }
    return cart;
}

Теперь вывод будет выглядеть так:

//Output
Add free gift:

0:{name: 'The Foundation Trilogy', price: 19.99, discount: false}

1: {name: 'Godel, Escher, Bach', price: 15.99, discount: false}

2: {name: 'Red Mars', price: 5.99, discount: true}

3: {name: 'Guide to Science Fiction', discount: true, price: 0}
//Output 
Summarize cart:

0:{name: 'The Foundation Trilogy', price: 19.99, discount: false}

1: {name: 'Godel, Escher, Bach', price: 15.99, discount: false}

2: {name: 'Red Mars', price: 5.99, discount: true}

3: {name: 'Guide to Science Fiction', discount: true, price: 0}

{error: 'Can only have one discount'}
//Output
Cart:

0: {name: 'The Foundation Trilogy', price: 19.99, discount: false}

1: {name: 'Godel, Escher, Bach', price: 15.99, discount: false}

2: {name: 'Red Mars', price: 5.99, discount: true}

Надеюсь, это поможет вам понять :)

Пожалуйста, следуйте за мной на среду для большего количества такого контента.

И вы можете связаться со мной в LinkedIn и Twitter.