• Как получить массив массивов с 2-мя объектами из 2-ух массивов с объектами?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Не будем ограничиваться двумя массивами, решим задачу в более общем виде:

    // если уверены, что длины всех массивов будут равны
    const zip = arrs => arrs[0]?.map((n, i) => arrs.map(m => m[i])) ?? [];
    
    // или, вместо отсутствующих значений подставляем какое-то дефолтное
    const zip = (arrs, defaultValue = null) => Array.from(
      { length: Math.max(...arrs.map(n => n.length)) },
      (n, i) => arrs.map(m => i < m.length ? m[i] : defaultValue)
    );
    
    // или
    const zip = (arrs, defaultValue = null) =>
      arrs.reduce((acc, n, i) => (
        n.forEach((m, j) => (acc[j] ??= Array(arrs.length).fill(defaultValue))[i] = m),
        acc
      ), []);

    Как этим пользоваться: const arr = zip([ arr1, arr2 ]);.
    Ответ написан
    1 комментарий
  • Как разбить массив на части заданного размера?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Или в более понятном виде:
    [
      {
        path: './name-1.jpg',
        filename: 'name-1'
      },
      {
        path: './name-2.jpg',
        filename: 'name-2'
      },
      {
        path: './name-3.jpg',
        filename: 'name-3'
      },
      {
        path: './name-4.jpg',
        filename: 'name-4'
      }
    ].reduce((acc, item, idx, arr) => { if (idx % 2) { acc.push([ arr[idx-1], item ]) } return acc }, [])
    
    /*
    [
      [
        { path: './name-1.jpg', filename: 'name-1' },
        { path: './name-2.jpg', filename: 'name-2' }
      ],
      [
        { path: './name-3.jpg', filename: 'name-3' },
        { path: './name-4.jpg', filename: 'name-4' }
      ]
    ]
    */
    Ответ написан
    Комментировать
  • Как разбить массив на части заданного размера?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Можно рассматривать нарезание массива на куски как самостоятельную операцию:

    const chunked = (arr, chunkSize) =>
      arr.reduce((acc, n, i) => (
        (i % chunkSize) || acc.push([]),
        acc.at(-1).push(n),
        acc
      ), []);
    
    
    console.log(chunked([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], 3));

    А можно - как частный случай группировки, и не обязательно одних только массивов:

    const group = (data, key) =>
      Array.prototype.reduce.call(
        data,
        (acc, n, i, a) => ((acc[key(n, i, a)] ??= []).push(n), acc),
        {}
      );
    
    const chunked = (data, chunkSize) =>
      Object.values(group(data, (_, i) => i / chunkSize | 0));
    
    
    console.log(chunked('0123456789', 3));
    console.log(chunked(document.querySelectorAll('img'), 5));

    Если режем на куски не массив, то и кусками тоже могут быть не массивы, а значения исходного типа (если данный тип поддерживает операцию получения куска значения):

    const chunked = (data, chunkSize, slice = data.slice) =>
      Array.from(
        { length: Math.ceil(data.length / chunkSize) },
        function(_, i) {
          return this(i * chunkSize, (i + 1) * chunkSize);
        },
        (slice instanceof Function ? slice : [].slice).bind(data)
      );
    
    
    console.log(chunked('abcdefghij', 4)); // так кусками будут тоже строки
    console.log(chunked('abcdefghij', 4, [].slice)); // а так - массивы
    console.log(chunked($('img'), 5));

    В качестве исходных данных могут выступать не только массивоподобные объекты, но и итерируемые, а саму выдачу кусков можно оформить в виде генератора:

    function* chunked(data, chunkSize) {
      let chunk = [];
    
      for (const n of data) {
        if (chunk.push(n) === chunkSize) {
          yield chunk;
          chunk = [];
        }
      }
    
      if (chunk.length) {
        yield chunk;
      }
    }
    
    
    console.log(Array.from(chunked([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ], 3)));
    console.log([...chunked(document.querySelectorAll('img'), 5)]);
    for (const n of chunked(Array(10).keys(), 4)) {
      console.log(n);
    }
    Ответ написан
    Комментировать
  • Как удалить запись в таблице через 7 дней?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Храните дату создания записи и просто при выборке исключайте строки, которые старее 7 дней относительно времени запроса.

    Еще небольшой вопрос. Если все-таки такое сделать возможно, то будет ли это сильно нагружать БД, скажем так, примерно, при 10'000 записях?

    10к это очень маленькое количество записей. На таком объеме не будет заметно.
    А вот если у вас сотни тысяч вставок и удалений, то фризы гарантированны.
    Ответ написан
    1 комментарий