【问题标题】:Merge random elements of array/split into chunks将数组的随机元素合并/拆分成块
【发布时间】:2016-09-17 07:12:24
【问题描述】:

如何使用一些特殊算法将数组拆分成块?例如。我需要将数组缩短到 10 个元素的大小。如果我有 11 个元素的数组,我希望合并两个下一个常设元素。如果我有 13 个元素的数组,我希望合并三个元素。等等。有什么解决办法吗?

Sample #1
var test = ['1','2','3','4','5','6','7','8','9','10','11'];
Need result = [['1'],['2'],['3'],['4'],['5|6'],['7'],['8'],['9'],['10'],['11']]

Sample #2
var test = ['1','2','3','4','5','6','7','8','9','10','11','12','13'];
Need result = [['1|2'],['3'],['4'],['5'],['6'],['7|8'],['9'],['10'],['11'],['12|13']]

提前谢谢你。

【问题讨论】:

  • 首先 - 表现出一些努力。第二 - 你如何检测合并了哪些元素?
  • @Mikelis Baltruks 我不需要检测。将随机元素与下一个常设元素合并以缩短数组就足够了
  • 但是为什么在第一个示例中合并在中间,但在第一个示例中它在两端?你想要吗?
  • 无论如何 - 如果您不亲自尝试,您将不会从任何人那里获得任何代码。基本思想是,您循环遍历数组并将元素放入 2d 数组中,每个元素形成一个新的 (1d) 数组。并合并 - 只需获得差异(需要 11 个,你有 15 个元素。diff = 4)并取那么多第一对并合并。休息就正常了
  • 是的,在第一个样本中,随机密钥为 4,它与 5 合并。在第二个元素中,随机密钥为 0(与 1 合并),下一个随机密钥为 6(与密钥 7 合并)和最后一个随机密钥是 12(与密钥 13 合并)。我只想缩短数组。

标签: arrays algorithm chunks


【解决方案1】:

以下代码很可能满足您的需求。

function condense(a){
  var  source = a.slice(),
          len = a.length,
  excessCount = (len - 10) % 10,
         step = excessCount - 1 ? Math.floor(10/(excessCount-1)) : 0,
    groupSize = Math.floor(len / 10),
     template = Array(10).fill()
                         .map((_,i) => step ? i%step === 0 ? groupSize + 1
                                                           : i === 9 ? groupSize + 1
                                                                     : groupSize
                                            : i === 4 ? groupSize + 1
                                                      : groupSize);
  return template.map(e => source.splice(0,e)
                                 .reduce((p,c) => p + "|" + c));
}

var test1 = ['1','2','3','4','5','6','7','8','9','10','11'],
    test2 = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21'];
console.log(condense(test1));
console.log(condense(test2));

【讨论】:

  • 哇!优秀的方法!非常感谢!
【解决方案2】:

A - 找出差异并创建许多随机数以进行合并并放入数组
B - 循环遍历初始数字数组。
B1 - 如果迭代器编号在合并编号数组中(使用 indexOf),则将其与下一个合并并增加迭代器(在它已合并且已在结果数组中时跳过下一个)
B1 示例

int mergers[] = [2, 7, 10]
//in loop when i=2
if (mergers.indexOf(i)>-1) { //true
   String newVal = array[i]+"|"+array[i+1]; //will merge 2 and 3 to "2|3"
   i++; //adds 1, so i=3. next loop is with i=4
}

C - 将新值放入结果数组

【讨论】:

    【解决方案3】:

    你可以试试这个代码

    jQuery(document).ready(function(){ 
    var test = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16'];  
    
    
            var arrays = [];
    
            var checkLength =  test.length;
    
            var getFirstSet = test.slice(0,10);
            var getOthers = test.slice(10,checkLength);
    
            $.each( getFirstSet, function( key,value ) {
                  if(key in getOthers){
                    values = value +'|'+ getOthers[key]; 
                    arrays.push(values);
                  }else{
                    arrays.push(value);            
                  }
            });
    
    
            console.log(arrays);
      
      });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多