在將其標記為另一個問題的回答之前,請注意這是一個陣列陣列,而不是一個平面陣列,此外,我給出的數字只是一個例子,我剛剛展示了它們,以便您可以直觀地看到發生了什么。
我正在嘗試遍歷陣列陣列。我有以下陣列:-
[
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[3, 2, 1, 6, 5, 4, 9, 8, 7],
[6, 5, 4, 9, 8, 7, 3, 2, 1],
[7, 8, 9, 3, 2, 1, 6, 5, 4]
]
如何將這個陣列轉換成 3x3 的塊,例如:-
[
[1, 2, 3, 1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6, 4, 5, 6],
[7, 8, 9, 7, 8, 9, 7, 8, 9],
[3, 2, 1, 6, 5, 4, 9, 8, 7],
[6, 5, 4, 9, 8, 7, 3, 2, 1],
[7, 8, 9, 3, 2, 1, 6, 5, 4],
]
正如您從上面的陣列中看到的,我使用每個陣列中的前 3 個值對其進行了分塊,然后是每個陣列中的第 2 個 3n 值,最后是每個陣列中的最后 3n 個值。
所以陣列將被分塊如下:-
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
1 2 3 | 4 5 6 | 7 8 9
---------------------
3 2 1 | 6 5 4 | 9 8 7
6 5 4 | 9 8 7 | 3 2 1
7 8 9 | 3 2 1 | 6 5 4
我試圖遍歷每一行并在它達到增量并增加行時重置列數,但這不起作用。
如果這有幫助,我可以用以前的嘗試更新問題嗎?還要注意的是,陣列的大小將不同,但始終可以被特定數字整除,對于上面的示例,我選擇了數字 3。
我已經用更多資訊更新了這個問題。陣列的陣列總是可以被一個特定的數整除,這個例子顯示了一個 3 的可整除數。
uj5u.com熱心網友回復:
這可以根據這個問題用一個塊來解決Split array into chunks with a zip as per this Javascript equivalent of Python's zip function
這樣做的好處是能夠反轉操作以恢復到原始狀態。
/** @see: https://stackoverflow.com/questions/8495687/split-array-into-chunks */
function chunk(array, chunk) {
let result = [];
for (let i = 0; i < array.length; i = chunk) {
result.push(array.slice(i, i chunk));
}
return result;
}
/** @see: https://stackoverflow.com/questions/4856717/javascript-equivalent-of-pythons-zip-function */
function zip(...rows) {
return [...rows[0]].map((_, c) => rows.map((row) => row[c]));
}
const array = [
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[3, 2, 1, 6, 5, 4, 9, 8, 7],
[6, 5, 4, 9, 8, 7, 3, 2, 1],
[7, 8, 9, 3, 2, 1, 6, 5, 4],
];
const result = chunk(array, 3)
.map((innerChunk) =>
zip(...innerChunk.map((arr) => chunk(arr, 3)))
.map((arr) => arr.flat())
)
.flat();
console.log(result.map((a) => a.join(', ')));
// Allows the result to be reverted to the original
const reversed = chunk(result, 3)
.map((innerChunk) =>
zip(...innerChunk.map((arr) => chunk(arr, 3)))
.map((arr) => arr.flat())
)
.flat();
console.log(reversed.map((a) => a.join(', ')));
uj5u.com熱心網友回復:
您可以使用嵌套回圈來完成,每次根據外部陣列的大小對陣列進行切片。
const arr = [
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[1, 2, 3, 4, 5, 6, 7, 8, 9]
];
let out = [];
for(let i in arr) { out.push([]);}
arr.forEach((e, i) => {
let scale = e.length / arr.length;
for(let j in arr)
{
out[j] = out[j].concat(e.slice(j * scale, j * scale scale));
}
});
console.log(out);
這是您編輯之前的原始陣列:
顯示代碼片段
const arr = [
[1, 3, 2, 5, 2, 4, 3, 6, 8],
[1, 4, 3, 6, 7, 3, 6, 4, 5],
[2, 4, 1, 4, 6, 3, 7, 9, 7]
];
let out = [];
for(let i in arr) { out.push([]);}
arr.forEach((e, i) => {
let scale = e.length / arr.length;
for(let j in arr)
{
out[j] = out[j].concat(e.slice(j * scale, j * scale scale));
}
});
console.log(out);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/402441.html
標籤:
