在javascript数组中均匀分布元素
我有一个数组对象:在javascript数组中均匀分布元素,javascript,arrays,Javascript,Arrays,我有一个数组对象: var titles = { "Part 1": [ ["1", "Title 1",A], ["2", "Title 2",B], ["3",
var titles = {
"Part 1":
[
["1", "Title 1",A],
["2", "Title 2",B],
["3", "Title 3",C],
["4", "Title 4",D],
["5", "Title 5",E]
],
"Part 2":
[
["6", "Title 6", A1],
["7", "Title 7", B1],
],
"Part 3":
[
["8", "Title 8", A2],
["9", "Title 9", B2],
["10", "Title 10", c2]
]
};
从这个对象开始,我需要构造3个数组,并将它们放在一个结果对象中。由于第1部分包含最多的值(5),因此我需要构造大小为5的数组。
如果第2部分和第3部分也包含5个值,那么这将是一个理想的场景。但有时,我确实会遇到第2部分和第3部分大小不是5的情况。在这些情况下,我需要均匀地分布值
Part 1:
[
["1", "Title 1",A],
["2", "Title 2",B],
["3", "Title 3",C],
["4", "Title 4",D],
["5", "Title 5",E]
],
Part 2:
[
["6"],
["7",],
["8", "Title 6",A1],
["9", "Title 7",B1],
["10"]
]
and Part 3:
[
["11"],
["12", "Title 8",A2],
["13", "Title 9",B2],
["14", "Title 10",C2],
["15"]
]
我试过以下方法:
var maxSize = 5;
const every_nth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
//Suppose we already have part1Array whose size is 5
let lengthPart1Array = part1Array.length+1;
let total_no_elements_part_2= 2;
let part2Array = every_nth([1,2,3,4,5],Math.floor(maxSize/total_no_elements_part_2));
let part2TitlesArray = new Array(maxSize);
//First I construct an array with 5 values
for(let j=0;j<part2TitlesArray.length;j++){
part2TitlesArray[j]= [j+lengthPart1Array];
}
//Then I fill up the index obtained from every_nth
for (let i = 0; i < part2Array.length; i++) {
insertAtIndex = part2Array[i];
var newArray =[parseInt(lengthPart1Array+insertAtIndex-1),"Title"+insertAtIndex];
part2TitlesArray[insertAtIndex-1]= newArray;
}
//Similar iteration for Part3Titles array as well
var result = {
"Part1":
part1Array,
"Part2":
part2TitlesArray,
"Part3":
part3TitlesArray
};
var maxSize=5;
常数每n=(arr,n)=>arr.filter((e,i)=>i%n==n-1);
//假设我们已经有了Part1阵列,其大小为5
让长度Part1阵列=Part1阵列。长度+1;
设总元素和部分元素=2;
设part2Array=每n个([1,2,3,4,5],数学层(最大尺寸/无元素的总尺寸/part 2));
让part2TitlesArray=新数组(maxSize);
//首先,我构造了一个包含5个值的数组
对于(设j=0;j),可以通过查看数组的长度来构建新的数组
var titles={“第一部分”:[“1”、“第1篇”、“A”]、[“2”、“第2篇”、“B”]、[“3”、“第3篇”、“C”]、[“4”、“第4篇”、“D”]、[“5”、“第5篇”、“E”]、“第2部分”:[“6”、“第6篇”、“A1”]、[“7”、“第7篇”、“B1”]、“第3部分”:[“8篇”、“第8篇”、“第2篇”、“第9篇”、“第9篇”、“B2”、[“第10篇”、“第2篇”]、“c2”],
length=Math.max(…Object.values(titles.map)({length})=>length)),
结果=对象。fromEntries(对象
.参赛作品(标题)
.map([k,数组],i)=>[
K
Array.from({length},(\uj)=>{
常数
左=(i*length+j+1).toString(),
offset=Math.ceil((length-array.length)/2);
返回j=offset+array.length
?[左]
:[左,…数组[j-偏移量]。切片(1)]
})
])
);
console.log(结果);
.as console wrapper{max height:100%!important;top:0;}
对不起,您可以检查一下输入和输出的内容吗?例如,输出中的11、12、13、14、15来自何处,以及为什么“Title[number]”第3部分中的值11、12、13、14、15中似乎随机分布的是需要按顺序排列的索引。例如,第1部分数组有5个元素1..5,然后第2部分数组需要从6、7、8、9、10开始,然后第3部分数组需要从11..15开始。标题[编号]没关系。它可以是任何字符串。谢谢尼娜,我稍后会试用它并在这里发表评论。太好了,谢谢你的帮助:)嘿@Nina,可以在数组元素之间分配相等的间距吗。我将第2部分数组作为:[“6”],[“7”],[“8”,“Title ab”],[“9”,“Title cd”],[“10”]]从中间开始分配元素。我如何更改它以获得输出为[[“6”]、[“7”、“Title ab”]、[“8”]、[“9”、“Title cd”]、[“10”]。因此,如果我在第2部分数组中有3个值,那么输出将是:[[“6”、“Title ab”]、[“7”]、[“8”、“Title cd”]、[“9”]、[“10”、“Title ef”]。这是可能的,但并不容易,因为它取决于所需项目的长度和数量。