• По какому принципу этот аргумент передается в функцию?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    filter(
       arr,  // первый аргумент - array (объект(не массив) с фильтруемыми вложенными объектами)
       a => a.name == "Adam" // второй аргумент -  test (функция)
    )


    в результате внутри
    function filter(array, test) { ... }

    аргументом test станет переданная стрелочная функция, как если бы мы написали:
    const test = (a) => {
       return a.name == "Adam" 
    }


    для понимания приведу почти аналог этой функции в обычной нотации
    function test(a){
       return a.name == "Adam"  // стравнивает a.name со строкой "Adam", возвращаетекгу true равны и false если не равны
    }


    далее:
    if (test(element)) {            // проверяем равен ли name элемента строке "Adam"
          result.push(element); // если равен, то добавляем в результирующий массив
    }
    Ответ написан
    1 комментарий
  • По какому принципу этот аргумент передается в функцию?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Функция – не что-то волшебное, а ещё один «объект» в JavaScript. Можно её записать в переменную или константу:
    const foo = function(arg) {
      return arg > 2;
    }

    Можно и передать функцию как аргумент в другую функцию:
    function mapper(array, func) {
      return array.map(func);
    }
    
    mapper([1, 2, 3], foo);

    И, наконец, стрелочные функции, вкратце(arg) => arg > 2;почти то же самое, что определение функции foo() выше.
    Ответ написан
    1 комментарий
  • По какому принципу этот аргумент передается в функцию?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    https://learn.javascript.ru/function-basics
    https://learn.javascript.ru/arrow-functions-basics
    https://learn.javascript.ru/callbacks

    a => a.name == "Adam"
    /*
    * стрелочная функция, принимающая на вход один аргумент, 
    * который может быт назван как угодно, 
    * и возвращающая при вызове результат сверки свойства name у переданного аргумента
    * со строкой 'Adam'
    */


    В свою очередь Вы передаёте в функцию filter два аргумента. Первый - arr, второй - стрелочная функция, рассмотренная выше.
    Внутри функции filter второй аргумент назван как test - это и будет эта стрелочная функция.
    Когда идёт вызов test(element) на деле происходит вызов этой стрелочной функции, в которую передаётся аргументом element.
    В итоге сравнивается element.name == "Adam"

    P.s.
    Это

    let arr = {
        object1 = {
            name: "Adam",
            year: 1997
        }, object2 = {
            name: "John",
            year: 2000
        }, object3 = {
            name: "Conor",
            year: 2001
        }, object4 = {
            name: "Adam",
            year: 2000
        }
    }


    Не валидная запись.
    Толи это массив, толи объект.
    Если массив, то
    так

    let arr = [
        {
            name: "Adam",
            year: 1997
        }, {
            name: "John",
            year: 2000
        }, {
            name: "Conor",
            year: 2001
        }, {
            name: "Adam",
            year: 2000
        }
    ]


    А объект
    так

    let arr = {
        object1: {
            name: "Adam",
            year: 1997
        }, object2: {
            name: "John",
            year: 2000
        }, object3: {
            name: "Conor",
            year: 2001
        }, object4: {
            name: "Adam",
            year: 2000
        }
    }

    Ответ написан
    1 комментарий
  • Почему не работает логика этих 2х циклов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Почему

    getElementsByClassName() возвращает «живую» коллекцию. Как только в DOM что-то меняется, коллекция обновляется.

    array[i].className = 'style'; заменяет все классы элемента на этот. Т.е. пропадает класс "card", по которому отбирали элементы. Обработанный элемент пропадает из коллекции. Коллекция сокращается, и следующее значение i подхватит элемент через-один от задуманного.

    Как быть

    Как вариант, делать из живой коллекции обыкновенный замороженный массив:
    let array = [...document.getElementsByClassName('card')]; // теперь это просто массив

    Ну и если задумка не лишать их класса card, то добавлять класс можно через classList.add(), как уже посоветовали.
    Ответ написан
    3 комментария