简体   繁体   English

在 javascript 数组中均匀分布元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM