javascript - 将数组分解为子集

标签 javascript arrays sorting subset

我试图让这个函数将数组分割成子集。每个子集的数字都等于前一个子集或与前一个子集相差 1 以内。 下面的示例应该返回两个子集,但它返回的是 {0, 1, 2, 3}。知道我做错了什么吗?另外,是否有更好的方法为每个新子集动态创建数组?谢谢

function max_tickets() {
    var arr = [4, 13, 2, 3];
    var myarr = arr.sort(function(a, b){return a-b});


for(var i = 0; i<myarr.length; i++){

    var iplus = i+1;
    if(i === i || i === iplus){
       newArr= [];
       newArr.push(i);
    }else if (i !== i || i !== iplus){
       arr2 =[];
       arr2.push(i);
  }
 }
}

最佳答案

您尝试执行的操作通常称为“分区”。问题的通用版本是使用一些“规则”、谓词或条件将数组划分为子数组,这些“规则”或谓词或条件指定特定元素应该进入哪个分区,或者指定它应该进入新分区.

执行此操作的伪代码是:

To partition an array:
  Initialize the resulting array
  For each element in the array
    If that element starts a new chunk
      Create a new empty chunk in the resulting array
   Add the element to the most recent chunk
   Return the result

这可以在 JS 中非常简单地表达为

function partition(array, fn) {
  return array.reduce((result, elt, i, a) => {
    if (!i || !fn(elt, i, a)) result.push([]);
    result[result.length - 1].push(elt);
    return result;
  }, []);
}

现在我们需要编写函数来说明何时启动新分区:

// Is the element within one of the previous element?
function close(e, i, a) {
  return Math.abs(e - a[i-1]) > 1;
}

我们现在可以使用以下命令对数组进行分区

partition([[4, 13, 2, 3], close)

关于javascript - 将数组分解为子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36525638/

相关文章:

javascript - 在范围数组中查找重叠并构建具有新分块范围的新数组

javascript - 在 Javascript 的一次迭代中进行映射和排序?

sorting - Solr 中的负提升

ios - 对包含 Å、Ä 和 Ö 的字符串数组进行排序 - Swift

javascript - Mongoose 查询完数据库后返回一个函数

javascript - vue-router 意外导入 token

arrays - 静态可变数组在 Rust 中不起作用

java - 从父类(super class)数组访问子类字段?

javascript - 如何等到 find 方法完成后再在 Ember 模型中进行进一步处理

javascript - 根据所选图像更改图像和描述