Как редактировать список задач без использования глобальных переменных Функциональное программирование Vanilla JS

#javascript #arrays #functional-programming #concat

#javascript #массивы #функциональное программирование #конкатенация

Вопрос:

Как вы постоянно редактируете массив задач при использовании FP? Я понимаю, что когда вы используете методы массива, такие как .concat(), вы возвращаете копию массива, а не редактируете оригинал. Вот мой исходный код, который просто помещает новое задание в массив todo. Это навсегда изменяет переменную myTodos, чего мы пытаемся избежать.

 let myTodos = []

function addTodo(newTodo) {
  myTodos.push(newTodo)
  return myTodos
}
  

Я переписал эту функцию как таковую:

 const addTodo = (arr, todoText) => arr.concat(todoText)
  

Это работает просто отлично, но я не понимаю, как сохранить возвращаемое значение, когда я должен избегать глобальных переменных. Если я вызову это, чтобы добавить второе задание в свой список, оно вернет только это второе задание, поскольку var нигде не сохраняется. Я чувствую, что есть очень очевидный способ сделать это, но я просто не могу в этом разобраться.

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

Комментарии:

1. Э-э, нет, push и pop изменяют исходный массив

2. У вас буквально нет причин создавать метод-оболочку вокруг метода push, учитывая то, что вы делаете. Просто нажмите на свой массив

3. @Taplar — вероятно, домашнее задание — должно быть функциональным

4. Но это не функционально , потому что слишком сложно, 🙂

5. @Taplar — полностью согласен.

Ответ №1:

 /*
1) how to avoid global variables?
2) how to not change the original?
3) how to keep the changed

#1 - this is called an Immediately Invoked Functional Expression (IIFE for short)
   What this does is lets us create a "scope" within our script.  Variables we
   create inside it with `var` or `let` or `const`, are not global.  They will
   only exist inside the scope.
*/
    (function(){
        var originalArray = [];
        // #2 - concat does not change the original array
        // #3 - to keep the change, just store it in another variable
        var changedArray = originalArray.concat('me');
        
        // #3 - if I want to make more changes, I use the new variable
        changedArray = changedArray.concat('yet another value');
        
        console.log(originalArray);
        console.log(changedArray);
    }());  

Комментарии:

1. Спасибо! Это именно то, что я искал. У меня создалось впечатление, что использование новой переменной для хранения массива было нечистым.