• Как перебрать методы объектов в массиве?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const arrayOfObjects = [
      { student: 'Dmitriy', runLab () {return 1;}},
      { student: 'Andrew', runLab () {return 2;}},
      { student: 'Mellisa', runLab () {return 3;}},
      { student: 'Ann', XrunLab () {return 4;}},
    ];
    
    function gradeLabs(labs, expectedResult = 1) {
      labs.forEach(({ student, runLab }) => {
        try {
          const result = runLab();
          if (result === expectedResult) {
            console.log('Student %s has PASSED the test', student);
          } else {
            console.error('Student %s has FAILED the test', student);
          }
        } catch (e) {
          console.error('Student: %s has FAILED the test. Error thrown: %o', student, e);
        }
      });
    }
    
    gradeLabs(arrayOfObjects, 1);
    Ответ написан
    2 комментария
  • Как перебрать методы объектов в массиве?

    mrswylet
    @mrswylet
    Этот ваш перебор очень странный, вы путаетесь в синтаксисе.
    arrayOfObjects.forEach((element) => element.runLab(), () => {
      if (element.runLab !== 1) {
        console.log(element.runLab());
      }
    })

    Я подозреваю, что вы хотели так сделать
    arrayOfObjects.forEach((element) => {
      const resultLab = element.runLab();
      if (resultLab !== 1) {
        console.log(resultLab);
      }
    });
    Ответ написан
    Комментировать
  • Как корректно реализовать код?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В подобного рода задчах - стоит цель просто продемонстрировать все что вы знаете про ООП. В данном случае ООП+JS. Поэтому берете любой учебнок по ООП и затаскиваете в ваш гамбургер все-что что там есть. Наследование. Билдер. Декоратор.

    Практическая польза от такого кода - нулевая. Потому что справочники размеров бургеров, топпингов и добавок не выделены в отдельные сущности. Тоесть UI не владеет этой информацией и не может корректно наполнить бургер. Или в противном случае UI будет должен каким-то образом (каким?) синхронизироваться с кодом.

    Или вы думаете что пользователь в бургерной будет стоять перед терминалов и в Java консоли код набирать?

    В реальном бизнес проекте классификатор продуктов может занимать до сотен тысяч позиций. Одних бургеров может быть до 1000 из которых например 300 - в будущих акциях а 400 - удалены с продаж но еще существуют
    в справочниках для аналитики. Будут абсолютные дубли по названиям но отличающиеся по цене. Будут товары недоступные любым а только VIP и так далее. Вот такие вот дела.

    Поэтому здесь что бургер что кот-собака или человек-обезьяна все едино. Демонстрируйте ООП в вакууме.
    Ответ написан
    1 комментарий
  • Как корректно реализовать код?

    Seasle
    @Seasle Куратор тега JavaScript
    class Hamburger {
        constructor(size, stuffing) {
            this.size = size;
            this.stuffing = stuffing;
            this.toppings = [];
        }
    
        static get SIZE_SMALL() {
            return { name: 'SIZE_SMALL', price: 50, calories: 20 };
        }
    
        static get SIZE_HUGE() {
            return { name: 'SIZE_HUGE', price: 100, calories: 40 };
        }
    
        static get STUFFING_CHEESE() {
            return { name: 'STUFFING_CHEESE', price: 10, calories: 20 };
        }
    
        static get STUFFING_SALAD() {
            return { name: 'STUFFING_SALAD', price: 20, calories: 5 };
        }
    
        static get STUFFING_POTATOE() {
            return { name: 'STUFFING_POTATOE', price: 15, calories: 10 };
        }
    
        static get TOPPING_SAUCE() {
            return { name: 'TOPPING_SAUCE', price: 15, calories: 0 };
        }
    
        static get TOPPING_MAYO() {
            return { name: 'TOPPING_MAYO', price: 20, calories: 5 };
        }
    
        addTopping(topping) {
            this.toppings.push(topping);
            return this;
        }
    
        calculateCalories() {
            const toppingCalories = this.toppings.reduce((total, topping) => total + topping.calories, 0);
            return this.size.calories + this.stuffing.calories + toppingCalories;
        }
    
        calculatePrice() {
            const toppingPrice = this.toppings.reduce((total, topping) => total + topping.price, 0);
            return this.size.price + this.stuffing.price + toppingPrice;
        }
    }

    const hamburger = new Hamburger(Hamburger.SIZE_SMALL, Hamburger.STUFFING_CHEESE);
    
    hamburger.addTopping(Hamburger.TOPPING_MAYO);
    console.log('Calories:', hamburger.calculateCalories());
    
    hamburger.addTopping(Hamburger.TOPPING_SAUCE);
    console.log('Calories:', hamburger.calculateCalories());
    
    console.log('Price with sauce:', hamburger.calculatePrice());
    Ответ написан
    6 комментариев
  • Почему некорректно работает код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Приведите точную формулировку задания насчёт "обмана". Несколько разных вариантов решения возможны..

    Например, переназначить свойства в объекте: установить геттер свойства age, и возвращать всегда валидное значение.

    Или в том виде как у вас, просто переназначить свойство length у массива reasons, чтобы он всегда был "пустой".
    Ответ написан
    4 комментария
  • Работа с объектом и массивом?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    for (let key in objectEmployee) {
    что будет в key?

    objectEmployee.key['age']
    есть ли у objectEmployee свойство key? (нет)

    spoiler
    const filters = {
      age: v => v >= 25,
      education: v => v === 'higher',
      experience: v => v >= 1,
    };
    
    const employee = {};
    const defaultDescriptor = { writable: true, enumerable: true, configurable: true };
    Object.defineProperties(employee, {
      name: { ...defaultDescriptor, value: 'Dmitriy', writable: false },
      age: { ...defaultDescriptor, value: 21 },
      education: { ...defaultDescriptor, value: 'higher' },
      experience: { ...defaultDescriptor, value: 0 },
    });
    
    const hireNewEmployee = (employee, filters) => {
      const errors = [];
      Object.entries(filters).forEach(([name, func]) => {
        if (!func(employee[name])) {
          errors.push(name);
        }
      });
    
      return errors.length
        ? `Not hired: sorry we cannot hire you. Here is why: ${errors.join(', ')}`
        : 'You are Hired! Congrats!';
    };
    
    hireNewEmployee(employee, filters);
    // "Not hired: sorry we cannot hire you. Here is why: age, experience"
    Ответ написан
  • Работа с объектами?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Object.keys(obj) возвращает массив собственных итерируемых строковых свойств. Как раз то, что хочется пересчитать в задаче.
    Из названия функции "isEmpty" следует, что она возвращает Булево значение (true / false).

    const isEmpty = obj => Object.keys(obj).length <= 2;

    Использование:
    console.log( isEmpty({ a: "AAA" }) ? 'object is empty' : 'object is full of properties' );
    // выведет "object is empty"
    
    console.log( isEmpty({ a: "AAA", b: "BB", c: "C" }) ? 'object is empty' : 'object is full of properties' );
    // выведет "object is full of properties"
    Ответ написан
    2 комментария
  • Не корректно работает код с замыканием?

    otdameskapizm
    @otdameskapizm
    Помог ответ? Отметь решением...
    У вас же первая функция возвращает функцию. Вы ее вызываете, она выводит в лог первый sum и все
    Нужно продолжать вызовы, чтобы вызывалась каждая из возвращаемых функций
    closures()()();
    Ответ написан
    5 комментариев
  • Как вывести значение ключа объекта?

    Вывести куда? В вашем примере не прописан сам вывод.
    Также коллбэк в forEach некорректно построен, вы пытаетесь передать в качестве аргумента некий this.balance. Но в функцию вообще нельзя передать аргумент в таком виде. У forEach есть конкретная сигнатура
    array.forEach((element, index, array) => {}) // 2 и 3 необязательные

    Поэтому, по сути, должно выглядеть хотя бы так
    array.forEach((element) => element.balance.startsWith("$1") && console.log(element.balance))


    Также можно деструктурировать, вытащив стразу свойство balance через фигурные скобки:
    array.forEach(({ balance }) => balance.startsWith("$1") && console.log(balance))


    Если же вам нужно получить именно отфильтрованный массив, состоящий из юзеров, чей баланс меньше 2k, то вместо forEach нужно использовать filter, возвращая результат его работы:
    function findBalance (array) {
      return array.filter(({ balance }) => balance.startsWith("$1"))
    }
    console.log(findBalance(users))


    А вообще хранить числа (в т.ч. денежные суммы) в виде строк - это чрезвычайно плохая идея. Лучше распилить свойство balance на два других свойства:
    // Вместо
    { balance: "$1,000.57" }
    
    // Сделать так
    {
      balanceAmount: 1000.57,
      balanceCurrency: '$'
    }
    
    // Или так
    {
      balance: {
        amount: 1000.57,
        currency: '$'
      }
    }


    Так хотя бы можно какие-то арифметические операции производить с этими числами. А вывести в нужном национальном формате число всегда можно, использовав toLocaleString()

    const balance = {
       amount: 1768.67,
       currency: '$'
    }
    console.log(`${balance.currency}${balance.amount.toLocaleString('en-EN')}`);


    А совсем уж по уму будет вот так:
    const balance = {
      amount: 1768.67,
      currency: 'USD'
    }
    console.log(balance.amount.toLocaleString('en-EN', { style: 'currency', currency: balance.currency }));
    Ответ написан
  • Как вывести значение ключа объекта?

    victormayorov
    @victormayorov
    Frontend разработчик
    users.filter(({ balance }) => Number(balance.slice(1).replaceAll(',', '')) < 2000).map(({ phone }) => phone);
    Ответ написан
    Комментировать
  • Как вывести значение ключа объекта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    users
      .filter(({ balance }) => +balance.replace(/[$,]/g, '') < 2000)
      .map(({ phone }) => phone);
    // [ "+1 (885) 559-3422", "+1 (837) 586-3283" ]
    Ответ написан
    6 комментариев
  • Где ошибка в удалении дубликатов в массиве?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ошибки:
    1. когда удаляется один элемент из массива, текущее значение i уже начинает указывать на следующий,
      но цикл for() увеличит i ещё на 1, и получится, что 1 элемент пропустили. Чинится уменьшением i на 1 сразу после удаления 1 элемента.
    2. верхнее значение i должно быть не меньше-или-равно, а меньше, чем длина массива.
    3. если текущий элемент дубль, то его индекс НЕ равен indexOf(value)

    Вот так работает:
    const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];
    
    function funcDeleteDuplicate(array) {
      for (let i = 0; i < array.length; i++) {
        if (array.indexOf(array[i]) !== i) {
          array.splice(i, 1);
          i--;
        }
      }
      return array;
    }
    console.log(funcDeleteDuplicate(duplicateArray));
    // [ "a", "b", "c", "q" ]


    Лучше:
    Когда речь об уникальных значениях, удобнее использовать Set — это коллекция, которая сохраняет только уникальные значения. Такой вариант хорош ещё тем, что не изменяет исходный массив.
    const funcDeleteDuplicate = array => [...new Set(array)];
    Ответ написан
    Комментировать
  • Где ошибка в удалении дубликатов в массиве?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];
    console.log(
        Array.from(new Set(duplicateArray))
    );

    const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];
    console.log(
        duplicateArray.reduce(function (carry, item) {
            if (!carry.includes(item)) carry.push(item);
            return carry;
        }, [])
    );

    const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];
    console.log(
        [...duplicateArray.reduce((carry, item) => [...carry].includes(item) ? carry : carry + item, '')]
    );
    Ответ написан
    Комментировать
  • Где ошибка в удалении дубликатов в массиве?

    @dGololobov
    начинающий
    Ошибка в том, что вы мутируете входящий массив.

    создайте дополнительный пустой массив, в который складывайте уникальные значения.
    И потом вернете его.
    А вообще есть и более красивые способы создать массив с уникальными значениями.
    Ответ написан
    Комментировать
  • Как вывести элементы массива, которые начинаются на букву A?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Есть хороший метод строки: startsWith()

    Подсказка:
    letterElement.startsWith('A')
    
    'Andrew'.startsWith('A') // true
    'Dmitriy'.startsWith('A') // false
    Ответ написан
    Комментировать
  • Как вывести элементы массива, которые начинаются на букву A?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. RTFM
    Метод includes() проверяет, содержит ли строка заданную подстроку, и возвращает, соответственно true или false.

    Метод startsWith() помогает определить, начинается ли строка с символов указанных в скобках, возвращая, соответственно, true или false.

    2.
    (letterElement) => letterElement.includes(letterElement)
    Строка всегда содержит саму себя.
    Ответ написан
    Комментировать
  • Почему функция возвращает массив с теме же данными?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Потому что Вы не прочитали документацию по методу.

    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Возвращаемое значение
    Массив, содержащий удалённые элементы.


    Соответственно, return [].splice() возвращает массив из элементов, которые были удалены.
    А ещё метод - деструктивный. То есть меняет исходные данные. arrayTaskOne, объявленный вне функции, изменился, а это не хорошо.
    Почему не хорошо? Гуглите по теме: чистые функции, сайд эффект
    Ответ написан
    Комментировать
  • Почему функция возвращает массив с теме же данными?

    SagePtr
    @SagePtr
    Еда - это святое
    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Возвращаемое значение
    Массив, содержащий удалённые элементы. Если будет удалён только один элемент, вернётся массив из одного элемента. Если никакие элементы не будут удалены, вернётся пустой массив.
    Ответ написан
    Комментировать
  • Почему функция возвращает массив с теме же данными?

    georgi1984
    @georgi1984
    Нравится JavaScript
    const arrayTaskOne = ['a','b','c','d'];
    function functionTaskOne (array) 
        let newArray = array;
        newArray.splice(0, 4, 'e', 'f', 'g', 'h');
        return newArray;
    }
    console.log(functionTaskOne(arrayTaskOne));
    Ответ написан
    Комментировать
  • Не работает код в switch case?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В alert нельзя ввести никакое значение.
    У вас, если введён хоть один символ, то всегда выполняется третья ветка, так как numOrStr == numOrStr.
    Для понимания можно расписать case как цепочку if/else
    if (numOrStr == null) {
      console.log('вы отменили');
    } else if (numOrStr == '') {
      console.log('Empty String');
    } else if (numOrStr == numOrStr) { // условие всегда истинно
      console.log(' number is Ba_NaN');
    } else {
      console.log('OK!'); // недостижимый код
    }

    Кроме того, prompt всегда возвращает строку, чтобы проверить, что введено число, надо попытаться преобразовать строку и убедиться, что получен не NaN. Сделать это можно через isNaN(Number(numOrStr)).
    Ответ написан
    Комментировать