• Как отсортировать массив массивов строк в js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Данная задача в принципе не решается сортировкой, так как сортировка это про отношение больше/меньше/равно, которого в данном случае нет.
    Самое простое здесь, это построить из этих элементов двусвязный список, а затем преобразовать его в результирующий массив:
    function orderArray(arr) {
      // для начала построим ноды списка и соберем их в 2 HashMap по обоим строкам
      const maps = arr.reduce((acc, item) => {
        const node = {item, next: null, prev: null};
        acc[0][item[0]] = node;
        acc[1][item[1]] = node;
        return acc;
      }, [{}, {}]);
    
      // после пройдемся по обоим HashMap и соединим связи
      for(const key of Object.keys(maps[0])) {
        maps[0][key].next = maps[0][maps[0][key].item[1]] || null;
      }
      for(const key of Object.keys(maps[1])) {
        maps[1][key].prev = maps[1][maps[1][key].item[0]] || null;
      }
    
      // найдем начальную ноду списка (ноду без предыдущей ноды)
      let cur = Object.values(maps[0]).find(({prev}) => prev === null);
    
      // и начиная с нее соберем список в массив
      const result = [];
      while(cur) {
        result.push(cur.item);
        cur = cur.next;
      }
    
      return result;
    }
    
    console.log(orderArray([['butter', 'jelly'], ['bananas', 'apples'], ['peanuts', 'butter'], ['jelly', 'bananas']]));
    Ответ написан
    1 комментарий
  • Написать функцию которая будет доставать именно дробную часть?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Определитесь, сколько значащих разрядов должно быть у дробной части.
    Округлите до этого значения
    Отбросьте незначащие нули.

    Например так:

    console.log(parseFloat((0.2 + 0.1).toFixed(3)));      // 0.3
    console.log(parseFloat((0.21 + 0.14).toFixed(3)));   // 0.35


    или так

    console.log(Number(Math.round((0.2 + 0.1)+'e'+3)+'e-'+3));      
    console.log(Number(Math.round((0.21 + 0.14)+'e'+3)+'e-'+3));


    или так, без использования строк

    console.log(Math.round((0.2 + 0.1) * 100) / 100); 
    console.log(Math.round((0.21 + 0.14) * 100) / 100);
    Ответ написан
    3 комментария
  • Почему indexOf находит подходящие значения там где их нет?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Не используй splice с forEach. Используй либо filter(создавая новый массив), или цикл с обратным перебором, или простой цикл и коррекцию индекса после удаления.

    Когда ты делаешь splice(i, 1) длина массива уменьшается на 1 и по индексу i становится следующий элемент. Соответственно, при следующей итерации i+1 указывает не на следующий элемент(который сдвинулся вверх), а на через один.
    Ответ написан
    1 комментарий