簡體   English   中英

取 3 個可變長度數組並將它們組合成每個索引的數組

[英]Take 3 variable length arrays and combine them into a arrays per index

我從 api 響應 obj 獲取 3 個數組。 它們有時可以是空的或可變長度的。

假設我有這 3 個數組:

[]
["2a", "2b"]
["3a", "3b", "3c"]

我希望將這些組合的最終結果是一個新數組,每個索引包含 1 個數組:

[
  ["", "2a", "3a"],
  ["", "2b", "3b"],
  ["", "", "3c"]
]

想看看是否有人有一種“優雅”的方式來做到這一點,因為我可以想出一種方法來做到這一點,但它相當怪異。
謝謝

將三個響應放入另一個數組,然后使用嵌套的Array.from()利用它內置的映射函數

 const ar = [ [], ["2a", "2b"], ["3a", "3b", "3c"] ]; // get longest of either subarray or main array lengths const len = {length: Math.max(...[...ar.map(e => e.length), ar.length])}; const res = Array.from(len, (_,i) => Array.from(len, (_,j) => (ar[j] && ar[j][i]) || '')) console.log(JSON.stringify(res))

似乎您想要獲取一個二維數組並“旋轉”它,以便行成為列。 然后將它們全部填充在前面以匹配最長的列。 這可以通過三個步驟來實現:

  1. 找出最長的數組。 這是目標長度。
  2. 用空字符串填充每個數組的開頭,直到達到目標長度。
  3. 執行矩陣轉置以“旋轉”陣列 90 度。

 //helper functions function findLongest(arr) { return arr.reduce( (longest, currentArray) => Math.max(longest, currentArray.length), 0 ) } function padStart(targetLength, fillWith, array) { const elementsNeeded = targetLength - array.length; const start = Array(elementsNeeded).fill(fillWith); return start.concat(array); } //from Fawad Ghafoor https://stackoverflow.com/a/17428705/ function transpose(array) { return array[0].map((_, colIndex) => array.map(row => row[colIndex])); } ////// //using the helper functions const startArr = [ [], ["2a", "2b"], ["3a", "3b", "3c"], ] const longest = findLongest(startArr); const paddedArray = startArr.map(arr => padStart(longest, "", arr)); const rotatedArray = transpose(paddedArray); //format for betted display in the console: const formattedArray = rotatedArray.map(arr => JSON.stringify(arr).replace(/"/g, "'")); console.log(formattedArray);

  • Args 要處理的數組數組
  • 一次循環遍歷一個索引並推入結果數組
  • 如果下一個索引中存在任何數據,則繼續處理。
  • 返回組合數組
  • O(m*n)復雜度,其中 m 是數組的數量,n 是數組的長度

代碼

const combineData = (...datas) => {
  let dataProcessed = false;
  let index = 0;
  const combinedData = [];

  while(!dataProcessed) {
    combinedData.push([]); // push new array for index
    dataProcessed = true; // assume data processed

    datas.forEach(data => {
      combinedData[index].push(data[index] ?? ""); // push value or ""
      if (data[index + 1]) dataProcessed = false; // check next index
    });

    index++; // bump index
  }

  return combinedData;
};

 const data1 = []; const data2 = ["2a", "2b"]; const data3 = ["3a", "3b", "3c"]; const data4 = ["4a", "4b", "4c", "4d"]; const combineData = (...datas) => { let dataProcessed = false; let index = 0; const combinedData = []; while(!dataProcessed) { combinedData.push([]); dataProcessed = true; datas.forEach(data => { combinedData[index].push(data[index] ?? ""); if (data[index + 1]) dataProcessed = false; }); index++; } return combinedData; }; console.log(JSON.stringify(combineData(data1, data2, data3))); console.log(JSON.stringify(combineData(data4, data1, data2, data3)));

var arr1 = [];
var arr2 = ["2a", "2b"];
var arr3 = ["3a", "3b", "3c"];

var numberToIterate = Math.max(arr1.length, arr2.length, arr3.length);

var finalArr = [];
 

for(var i=0; i<numberToIterate; i++) {
var temp = [];
if(!arr1[i]){
  arr1[i] = "";
}
if(!arr2[i]){
  arr2[i] = "";
}
if(!arr3[i]){
  arr3[i] = "";
}
 temp.push(arr1[i]);
 temp.push(arr2[i]);
 temp.push(arr3[i]);
 
 finalArr[i] = temp;
}

您的結果將保存在 finalArr 中。

我想這就是你要找的。 與數組的數量和任何長度無關。

 function createMatrix(...arrays){ const numOfArrays = arrays.length; // rows const longestArray = Math.max.apply({},arrays.map(a => a.length)) //columns let matrix = [] for(let i =0; i<numOfArrays; i++){ matrix[i] = matrix[i] ||[]; for(let j=0; j<numOfArrays; j++){ matrix[i].push(arrays[j] && arrays[j][i] || '') } } return matrix || []; } const result = createMatrix([1], [2, 22], [3, 33, 333]) const result2 = createMatrix([], [2, 22], [3, 33, 333], [4, 44, 444, 4444]) console.log(result) console.log(result2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM