@hryashik

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

Привет, имеется массив с объектами. Пытаюсь построить функцию, которая фильтрует элементы массива (по свойству объекта) и возвращает массив с этими объектами. Объясните принцип передачи такого аргумента.
let arr = {
    object1 = {
        name: "Adam",
        year: 1997
    }, object2 = {
        name: "John",
        year: 2000
    }, object3 = {
        name: "Conor",
        year: 2001
    }, object4 = {
        name: "Adam",
        year: 2000
    }
}

function filter(array, test) {
    let result = [];
    for (let element of array) {
        if (test(element)) {            // Объясните как работает эта строчка
            result.push(element);
        }
    }
    return result;
}
console.log(filter(arr, a => a.name == "Adam"));   // И тут

Объясните как ведет себя машина конкретно во втором аргументе. Откуда берется эта a, и почему вместо нее можно подставить что угодно и оно будет работать? Например: script=>script.name и т.д.
  • Вопрос задан
  • 102 просмотра
Решения вопроса 3
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
    }
}

Ответ написан
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() выше.
Ответ написан
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); // если равен, то добавляем в результирующий массив
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы