[英]Uniformly distribute elements in an javascript array
I have an object of arrays as such:我有一个 arrays 的 object 如下:
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]
]
};
From, this object I need to construct 3 arrays and put them in a result object.从这个 object 开始,我需要构造 3 个 arrays 并将它们放入结果 object 中。 Since Part 1 contains highest number of values (5), I need to construct the arrays of size 5. If Part 2 and Part 3 also contained 5 values, then it would have been an ideal scenario.由于第 1 部分包含最多数量的值 (5),我需要构建大小为 5 的 arrays。如果第 2 部分和第 3 部分也包含 5 个值,那么这将是一个理想的场景。 But sometimes, I do get the cases where part 2 and part3 are not of size 5. In those cases, I need to distribute values uniformly.但有时,我确实会遇到第 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"]
]
I tried by following way:我尝试了以下方式:
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
};
Is there any better way to achieve this?有没有更好的方法来实现这一目标? How can I distribute the values as per my requirement?.如何根据我的要求分配值?
You could build new arrays by looking to the length of the arrays.您可以通过查看 arrays 的长度来构建新的 arrays。
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']] }, length = Math.max(...Object.values(titles).map(({ length }) => length)), result = Object.fromEntries(Object.entries(titles).map(([k, array], i) => [ k, Array.from({ length }, (_, j) => { const left = (i * length + j + 1).toString(), offset = Math.ceil((length - array.length) / 2); return j < offset || j >= offset + array.length? [left]: [left, ...array[j - offset].slice(1)] }) ]) ); console.log(result);
.as-console-wrapper { max-height: 100%;important: top; 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.