@holllop

Как обработать массив переменной длины?

Я отправляю в node массив
function accepting_expenses_array(req, res) {
  const expenses_array = req.body;
  const expenses_as_numbers = expenses_array.map(Number);
  console.log(expenses_as_numbers);
  console.log(expenses_as_numbers.length)

  pool.query('SELECT MAX(id_work) FROM "works"', (error, maxResult) => {
    if (error) {
      throw error;
    }
    const maxIdWork = maxResult.rows[0].max;  
    const insertQuery = 'INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)';
    const values =  [
      maxIdWork,
      expenses_as_numbers[0],
      expenses_as_numbers[1],
      expenses_as_numbers[2],
      expenses_as_numbers[3],
      expenses_as_numbers[4],
      expenses_as_numbers[5],
      expenses_as_numbers[6],
      expenses_as_numbers[7]
    ];
    console.log(values);
    pool.query(insertQuery, insertValues, (insertError, insertResult) => {
      if (insertError) {
        throw insertError;
      }
      response.status(200).json(insertResult.rows);
    });
  });
}

но вот вся проблема заключатся в том, что этот массив expenses_as_numbers может быть различной длины (от 8 до 64 (всегда кратен 8, например: 8, 16, 24, итд и так до 64). и я придумал и реализовал как обращаться с массивом когда его длина составляет 8. И я думал сделать какой-то хитрый метод тип я "откусываю" от первоначального массива длину в 8 и потом проворачиваю всё что мне нужно, потом снова "откусываю" 8 и так пока длина массива не будет 0. Но вот можно ли так в node и как это реализовать я не знаю

P.S. Пока вопрос смотрят придумал вот это
function accepting_expenses_array(req, res) {
  const expenses_array = req.body;
  const expenses_as_numbers = expenses_array.map(Number);
  
  // Определяем MAX(id_work) из таблицы "works"
  pool.query('SELECT MAX(id_work) FROM "works"', (error, maxResult) => {
    if (error) {
      throw error;
    }
    const maxIdWork = maxResult.rows[0].max;

    // Формируем INSERT-запрос и значения для вставки
    let insertQuery = 'INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES ';
    let values = [];
    
    for (let i = 0; i < expenses_as_numbers.length; i += 8) {
      if (i !== 0) {
        insertQuery += ', ';
      }
      insertQuery += `($${i * 8 + 1}, $${i * 8 + 2}, $${i * 8 + 3}, $${i * 8 + 4}, $${i * 8 + 5}, $${i * 8 + 6}, $${i * 8 + 7}, $${i * 8 + 8})`;
      // Формируем значения для вставки
      values.push(maxIdWork, ...expenses_as_numbers.slice(i, i + 8));
    }
    
    console.log(values);
    console.log(insertQuery );
    
}

только это работает не так.
Получаю в консоле
INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES ($1, $2, $3, $4, $5, $6, $7, $8), ($65, $66, $67, $68, $69, $70, $71, $72), ($129, $130, $131, $132, $133, $134, $135, $136)

а ожидал получить при длине массива в 24
INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES ($1, $2, $3, $4, $5, $6, $7, $8), ($1, $9, $10, $11, $12, $13, $14, $15), ($1, $16, $17, $18, $19, $20, $21, $22)
  • Вопрос задан
  • 90 просмотров
Решения вопроса 2
IvanU7n
@IvanU7n
nothing interesting here
const data = [ /* ... */ ];
let offset = 0;
while (offset < data.length) {
	data[offset + 0];
	data[offset + 1];
	// ...
	data[offset + 7];
	offset += 8
}
Ответ написан
@holllop Автор вопроса
Сначала хочу выразить великую благодарность IvanU7n, он меня подтолкнул к ответу
function accepting_expenses_array(req, res) {
  const expenses_array = req.body;
  const expenses_as_numbers = expenses_array.map(Number);
  
  // Определяем MAX(id_work) из таблицы "works"
  pool.query('SELECT MAX(id_work) FROM "works"', (error, maxResult) => {
    if (error) {
      throw error;
    }
    const maxIdWork = maxResult.rows[0].max;

    // Формируем INSERT-запрос и значения для вставки
    let insertQuery = 'INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES ';
    let values = [];
    
    for (let i = 1; i < expenses_as_numbers.length; i += 8) {
      if (i !== 0) {
        insertQuery += ', ';
      }
      insertQuery += `($${1}, $${i + 1}, $${i + 2}, $${i + 3}, $${i + 4}, $${i + 5}, $${i + 6}, $${i + 7}, $${i + 8})`;
      // Формируем значения для вставки
      values.push(maxIdWork, ...expenses_as_numbers.slice(i, i + 8));
    }
    
    console.log(values);
    console.log(insertQuery);
  });
}

в консоле получаю
INSERT INTO "expenses" (n_plan, type_work_id, printer_id, material_id, performer_id, format_id, n_sheets, n_page, n_ruined) VALUES , ($1, $2, $3, $4, $5, $6, $7, $8, $9), ($1, $10, $11, $12, $13, $14, $15, $16, $17), ($1, $18, $19, $20, $21, $22, $23, $24, $25), ($1, $26, $27, $28, $29, $30, $31, $32, $33)

а это именно, то чего я хотел достичь
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы