Solving the problem about currencies | JavaScript interviews

Поделиться
HTML-код
  • Опубликовано: 2 ноя 2024

Комментарии • 36

  • @Андрей-й9ц6я
    @Андрей-й9ц6я 4 года назад +10

    Еще один вариант на reduce:
    input.reduce((accum, [currency, operation, sum]) => {
    let [buy = 0, sell = 0] = accum[currency] || [];
    operation === 'buy' ? (buy += sum) : (sell += sum);
    accum[currency] = [buy, sell];
    return accum;
    }, {})

    • @smashno
      @smashno 4 года назад +2

      Класс! Вышло вообще обойтись без индексов 0 и 1 для массива :) Читать удобно!

    • @Андрей-й9ц6я
      @Андрей-й9ц6я 4 года назад +3

      @@smashno К сожалению сильно завязано на двух операциях, если их количество изменится, придется все переписывать. Плюс еще сравнение со строкой не очень хорошо, от строк в условиях лучше всего избавляться, так как это источник ошибок. Но для минутного решения пойдет. Спасибо вам за интересные задачки :)

    • @smashno
      @smashno 4 года назад +2

      @@Андрей-й9ц6я Если не ошибаюсь задача построена на реальном формате данных с реального проекта. Так что такое решение вполне ок. Учитывая то что операции бывают только buy и sell и новых не предполагается ). На подходе новые задачки - посложнее.

  • @InFuz92
    @InFuz92 2 года назад +1

    Что удивительно с первого раза заработало, хотя обычно несколько итераций фикса своих ошибок приходится делать)
    const f = (input) =>
    input.reduce((res, [cName, oName, val]) => {
    res[cName] = [
    (res[cName]?.[0] ?? 0) + (oName === 'buy' ? val : 0),
    (res[cName]?.[1] ?? 0) + (oName === 'sell' ? val : 0)
    ];
    return res;
    }, {});

  • @blgarOk
    @blgarOk 2 года назад

    Мой франкенштейн.
    function calc(arr) {
    let out = {}
    arr.forEach(el => {
    let key = el[0]
    if(!out[key]) out[key] = [0, 0]
    el[1] === 'buy'
    ? out[key] = [out[key][0] + el[2], out[key][1]]
    : out[key] = [out[key][0], out[key][1] + el[2]]
    })
    return out
    }
    Красивое первое решение у автора видео, читаемое и лаконичное. Пару моментов взял себе на заметку.

    • @frontendscience
      @frontendscience  2 года назад

      Благодарю за решение! Хорошо вышло!

  • @EvilYou
    @EvilYou 3 года назад

    Задача легкая, но свое решение оставлять не буду, так как оно вышло не таким красивым.
    Мне понравилась эта строка кода в решении:
    output[name][type === 'buy' ? 0 : 1] += value;
    Максимально кратко и лаконично!

  • @ВадимБєк
    @ВадимБєк 4 года назад +1

    let countCash = (transactions) =>{
    let result ={};
    for(let i = 0; i

    • @frontendscience
      @frontendscience  4 года назад

      Класс! Всегда клево видеть свой прогресс. Заказывай еще задачки.

    • @ВадимБєк
      @ВадимБєк 4 года назад +1

      @@frontendscience было бы интересно увидеть задачу про формирование сценария. Там даны роли и текст и нужно строку текста разделить на реплики отдельных персонажей и построчно выводить. когда-то не получилась она

    • @frontendscience
      @frontendscience  4 года назад

      Вадим Бєк а есть пример входных данных?

  • @yarik83men51
    @yarik83men51 2 года назад +1

    Спасибо.
    На Java:
    import java.util.ArrayList;
    import java.util.HashMap;
    public class ValuteOperations {
    public static void main(String[] args) {
    Money[] inputAr = {
    new Money("usd", "buy", 10000),
    new Money("usd", "sell", 5000),
    new Money("gbp", "buy", 9000),
    new Money("eur", "sell", 7000),
    new Money("uah", "buy", 10000),
    new Money("usd", "sell", 25000)
    };
    outputAr(inputAr);
    }
    private static void outputAr(Money[] arr) {
    HashMap mapAr = new HashMap();
    for (Money m : arr) {
    ArrayList listAr = new ArrayList();
    if (m.operation.equals("buy")){
    listAr.add(m.count);
    listAr.add(0);
    } else {
    listAr.add(0);
    listAr.add(m.count);
    }
    ArrayList mSearch = mapAr.get(m.name);
    if ((mapAr.get(m.name)) != null) {
    listAr.set(0, listAr.get(0) + mSearch.get(0));
    listAr.set(1, listAr.get(1) + mSearch.get(1));
    }
    mapAr.put(m.name, listAr);
    }
    System.out.println(mapAr); } }
    class Money {
    String name;
    String operation;
    int count;
    public Money(String name, String operation, int count) {
    this.name = name;
    this.operation = operation;
    this.count = count; } }

  • @ИльяГорский-д6е
    @ИльяГорский-д6е 4 года назад +5

    var output = input.reduce((output, [currency, operation, value]) => {
    const cursorOperation = operation === 'buy' ? 0 : 1;
    output[currency] = output[currency] || [0, 0];
    output[currency][cursorOperation] += value;
    return output;
    }, {});

    • @smashno
      @smashno 4 года назад +1

      Классно получилось - и компактно и читаемо!

  • @МакМёрфи-о8и
    @МакМёрфи-о8и 3 года назад

    Спасибо за задачу, у меня получилось но мне самому страшно на это смотреть. Ваш первый вариант прям конфетка.
    function trans(input){
    let obj = {};
    for(let item of input){
    if(item[0] !== Object.keys(obj)){
    obj[item[0]] = [0,0]
    }
    }
    Object.keys(obj).forEach((key) => {
    for(let i = 0; i < input.length; i++){
    if(input[i][1] === 'sell' && input[i][0] === key){
    obj[key][1] += Number([input[i][2]])
    }
    if(input[i][1] === 'buy' && input[i][0] === key){
    obj[key][0] += Number([input[i][2]])
    }
    }
    })
    return obj;
    }

    • @frontendscience
      @frontendscience  3 года назад

      Благодарю за решение! Отлично справились!

  • @МаксимСоловьев-с9н
    @МаксимСоловьев-с9н 11 месяцев назад

    const currency = (input) => {
    const hash = {}
    for(let [curren, operation, value] of input){
    if(!hash[curren]) hash[curren] = [0, 0]
    hash[curren][operation === 'buy' ? 0 : 1] += value
    }
    return hash
    }

  • @grenkilove1944
    @grenkilove1944 3 года назад

    Подскажите почему эта строчка :
    accum[curr[0]][curr[1] === 'buy' ? 0 : 1] += curr[2];
    при true добавляет в нулевой элемент массива а при false в первый, что делать если больше двух параметров? Как грамотно присвоить им значение

    • @frontendscience
      @frontendscience  3 года назад

      Рекомендую почитать про тернарный оператор в js. Именно благодаря ему мы в зависимости от значения buy или sell делаем присвоение или в 0 или d 1 элемент массива. Если будет больше 2х вариантов то тернарным оператором уже не обойтись, можно было бы такое решить или через switch/case или через if/else. Есть и другие способы но тут уже может зависеть от формата входных данных

  • @tarlock4089
    @tarlock4089 3 года назад

    Почему просто не оставить type===sell, если это так, то 1 индекс, иначе же 0

    • @frontendscience
      @frontendscience  3 года назад

      присылай решение!

    • @SerzhNesteruk
      @SerzhNesteruk Год назад

      Да, вместо тернарника здесь можно использовать быстрое преобразование типов:
      +(type === 'sell')
      или
      +(type !== 'buy')
      true у нас превратится в 1, а false в 0...
      Но практиковать в реальном проекте неочевидные преобразования всё таки не самая лучшая идея, поскольку они затрудняют интуитивное понимание кода и дальнейшую поддержку проекта. Лучше избрать менее лаконичный, но более читаемый вариант, например:
      {'buy': 0, 'sell': 1}[type]

  • @shapilov
    @shapilov 3 года назад

    У меня получился менее "ниндзявый" вариант
    function calcCurrencies(transactions) {
    return transactions.reduce((acc, transaction) => {
    const [curr, type, amount] = transaction
    const typeIndex = type === 'buy' ? 0 : 1
    if (!acc[curr]) acc[curr] = [0, 0];
    acc[curr][typeIndex] += amount
    return acc
    }, {})
    }

    • @frontendscience
      @frontendscience  3 года назад

      Отличный вариант вышел! Благодарю что поделились!

  • @Ramosok
    @Ramosok 7 месяцев назад

  • @gooseob
    @gooseob 2 года назад +1

    Спасибо, у меня похоже получилось
    const result = {};
    input.forEach(([currency, action, amount]) => {
    result[currency] ||= [0, 0];
    const isSell = action === 'sell';
    result[currency][+isSell] += amount;
    });

  • @Denis-rh9jp
    @Denis-rh9jp Год назад

    function SumMoney(arg){
    let res = arg.reduce((a,el)=>{
    if(!a[el[0]]){
    a[el[0]] = [0,0]
    }
    a[el[0]][el[1] === 'buy' ? 0 : 1] += el[2]
    return a
    },{})
    return res
    }

  • @SerzhNesteruk
    @SerzhNesteruk Год назад +1

    input.reduce((acc, [currency, type, amout]) => {
    acc[currency] = acc[currency] || [0, 0];
    const index = {'buy': 0, 'sell': 1}[type];
    acc[currency][index] += amout;
    return acc;
    }, {});

    • @EvilYou
      @EvilYou Год назад +1

      красиво