我有一個陣列,比如:
var myArray = [[1, 2, 3, 4], [5, 6], [7, 8, 9], [10]】。]
我如何用以下規則對這個陣列進行重新排序:
我如何對這個陣列進行重新排序?
myArray[0][0]減少到2個元素(值1,2留下,3,4到下一個陣列)- 保留所有的值,只是把多余的陣列元素移到下一個陣列中,但是除了最后一個陣列外,所有的陣列都需要保持當前的元素數 。
我已經嘗試的是:
我已經嘗試了。
function conditionalChunk(array, size, rules = {}){
let copy = [...array],
輸出=[]。
i = 0;
while (copy.length)
output.push( copy.splice(0, rules[i ] ? size) )
return output
}
conditionalChunk(myArray, 3, {0:2}) 。
但是在這種情況下,我需要為陣列中的所有陣列制定規則,我需要知道陣列中所有陣列的元素數量,而這正是我想要避免的。
有什么優雅的方法可以做到這一點嗎?
uj5u.com熱心網友回復:
這是我想出的辦法。將代碼粘貼到chrome控制臺并進行測驗。
var myArray = [[1, 2, 3, 4], [5, 6], [7, 8, 9], [10]】。]
//Getting initial lengths of inner arrays [4, 2, 3, 1]
var lengths = [];
for(var arr of myArray) {
lengths.push(arr.length)。
}
//將所有內部陣列的元素提取為一個陣列。
var allElements = [];
for(var arr of myArray) {
for(var ele of arr) {
allElements.push(ele)。
}
}
//根據你的要求更新第一個和最后一個內部陣列的長度。
var firstArrLen = 2;
var lastArrLen = lengths[lengths.length -1] (lengths[0] - 2)
lengths[0] = firstArrLen;
lengths[lengths.length -1] = lastArrLen。
// Initializing the final/result array.
var finalArr = [] 。
//將新的內部陣列添加/推入finalArr。
for(var len of lengths) {
var tempArr = [];
for(var i=0; i< len; i ) {
tempArr.push(allElements[i])。
}
finalArr.push(tempArr)。
for(var i=0; i<len; i ) {
//從陣列中洗掉第一個元素。
allElements.shift()。
}
uj5u.com熱心網友回復:
要求不是那么明確,我不知道你為什么要做這些事,但這里有你的解決方案。我已經寫了一個函式,你可以用它來限制子陣列的cardinality。
。var myArray = [[1, 2, 3, 4], [5, 6], [7, 8, 9], [10]】。]
function reorderArray(arr) {
let buff = [] 。
let newArr = [];
let maxSubarrCardinality = 2;
//flatMapping 第二層元素
//在單層緩沖區內; //在單層緩沖區內。
for (subArr of arr) {
for (elem of subArr) {
buff.push(elem)。
}
}
//Inserting elements one at the time
//插入一個新的陣列。
for (elem in buff) {
//當新陣列為空時。
//在新陣列中推入第一個空的subArray。
if (newArr.at(-1) == undefined)
newArr.push([])。
//if the last subArray has reached
//maxCardinality推送一個新的子Array。
else if (newArr.at(-1).length >= maxSubarrCardinality) {
newArr.push([])。
newArr.at(-1).push(elem)。
}
//if none of the previous special cases[/span].
//只是將元素添加到newArray的最后一個子Array。
else {
newArr.at(-1).push(elem)。
}
}
return newArr;
}
myArray = reorderArray(myArray);
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
uj5u.com熱心網友回復:
步驟[/h3
我使用了Array#flat,所以我必須跟蹤每項的索引和長度。
let i = 0;
let itemLength = array[0]? .length。
扁平化陣列后,我使用Array#reduce來回圈瀏覽這些專案,將initialValue設定為一個空陣列。
我得到陣列中的最后一個專案,并檢查其長度是否達到了允許的最大值(這應該是該索引的rules引數或size引數中設定的)。
如果沒有達到最大值,我就把當前項推到最后一個陣列中。如果達到了,我就創建一個新的陣列,把該專案作為唯一的元素
如果沒有達到最大值,我就把當前專案推到最后一個陣列中。
array.flat()。 reduce((acc, cur) =>/span> {
if (acc.length === 0) acc.push([]); // just for first iteration
if (acc.at(-1).length < (rules[i] ? ? size)) acc[acc.length - 1].push(cur)。
else acc.push([cur])。
如果這樣的話,要么遞減itemLength的值,要么將其設定為下一個陣列的長度,并將i變數遞增到下一個索引
itemLength = itemLength === 0 ? (array[ i]? []).length : --itemLength;
。
let array = [[1, 2, 3, 4], [5, 6], [7, 8, 9], [10]】。]
function conditionalChunk(array, size, rules = {}) {
let i = 0;
let itemLength = array[0]?.length;
return array.flat().reduce((acc, cur) => /span>{
if (acc.length === 0) acc.push([]); // just for first iteration
if (acc.at(-1).length < (rules[i] ? ? size)) acc[acc.length - 1].push(cur)。
else acc.push([cur])
itemLength = itemLength === 0 ? (array[ i]? []).length : --itemLength;
return acc;
}, []);
}
console.log(JSON. stringify(conditionalChunk(array, 3, {0: 2 }));
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/331530.html
標籤:
上一篇:點擊時不要改變按鈕的界面
