如何使用Javascript从未知大小的数组中获取未知大小的数据?

时间:2019-06-11 11:00:46

标签: javascript arrays node.js

任务是从column对象获取部分数据并将其发送到数据库。零件必须具有insertMaxRows的最大大小。

我尝试了一些迭代并使用了模运算符。但是我还是一个初学者,无法解决这个问题。

var insertMaxRows = utils.GetInsertMaxRows();   //right now its 2
var idx = 1;

for (var i = 0; i < columns.id.length; i++) {

if (idx % insertMaxRows == 0){

    var params = [];

    //this takes just 1 value, i know
    params.push(columns.codes[idx -1]);     
    params.push(columns.product_id[idx -1]);
    params.push(columns.id[idx -1]);

    updateSql = "UPDATE TProductCodes SET code =?, product_id =? WHERE id =?";

    sql.query(connection, params, etc, callback) {

        //sends stuff to database
    });
idx++;
}

例如,当insertMaxRows2时,此代码应将数组中的前2个项目发送到数据库,然后将其后的2个项目发送到数据库,依此类推,然后其余的发送

请注意,这是针对NODE JS的,如果有关系的话,它将通过异步函数发送到数据库。

2 个答案:

答案 0 :(得分:1)

这就是我可能的处理方式。它遍历数据,并创建一个新的Promise,其中包含每个数据块的UPDATE调用(我splice来自数组)。您可以使用Promise.all等待所有更新解决。

// set up the data
const data = [];
for (let i = 0; i < 100; i++) {
  data.push(i);
}

function UPDATE(data) {
  return new Promise(resolve => {

    // mimic an SQL UPDATE query
    setTimeout(() => resolve(), 2000);
  });
}

function getPromises(data, limit) {
  const promises = [];

  // Iterate through the data, splicing off a chunk at
  // a time, and creating a new promise for each
  for (let i = 0; i < data.length; i++) {
    const chunk = data.splice(0, limit);
    promises.push(UPDATE(chunk));
  }
  return promises;
}

(async () => {
  const limit = 12;

  // Wait until all the promises have resolved
  await Promise.all(getPromises(data, limit));
  console.log('Done');
})();

答案 1 :(得分:0)

另一种方法是根据fcntl()的极限值arrays,在三元组或成对子组中准备线性insertMaxRows,以便将数组拆分成对。

之后,您可以在两对上进行2循环。在此示例中,有7个值,因此最后一个值将是单个。

处理完列对象后,将如下所示:

forEach

{ id: [[1, 2], [3, 4], [5, 6], [7]], product_id: [[11, 22], [33, 44], [55, 66], [77]], codes: [["a", "b"], ["c", "d"], ["e", "f"], ["g"]] } 对象内部的3个线性数组除以极限值的函数示例。

columns

如果您需要更多有关如何将两对或三元组缝合回线性阵列的帮助,例如将这种样式var insertMaxRows = 2; var columns = { id : [1,2,3,4,5,6,7], codes : ['a','b','c','d','e','f','g'], product_id : [11,22,33,44,55,66,77], }; console.log(columns); // before grouping values function groupArrayByLimit(arr,limit){ if(typeof arr == 'object' && typeof limit == 'number' && limit>=1){ var res = []; while (arr.length) { var tmp = []; var itt = 0 while (itt<limit && arr.length){ tmp.push(arr.shift()); itt++; //console.log(tmp); } res.push(tmp); //console.log(res); } return res; } return null; } columns.id = groupArrayByLimit(columns.id,insertMaxRows); columns.codes = groupArrayByLimit(columns.codes,insertMaxRows); columns.product_id = groupArrayByLimit(columns.product_id,insertMaxRows); console.log(columns); // after regrouping values 作为MySQL查询的参数,请在注释中告知我们。